diff --git a/src/libsysprof/sysprof-local-profiler.c b/src/libsysprof/sysprof-local-profiler.c index 621df054..62b46a44 100644 --- a/src/libsysprof/sysprof-local-profiler.c +++ b/src/libsysprof/sysprof-local-profiler.c @@ -91,6 +91,9 @@ typedef struct /* If we should inherit the environment when spawning */ guint spawn_inherit_environ : 1; + /* If we should inherit stdin from our process */ + guint inherit_stdin : 1; + /* * If we should profile the entire system. Setting this results in pids * being ignored. This is primarily useful for UI to toggle on/off the @@ -114,6 +117,7 @@ G_DEFINE_TYPE_EXTENDED (SysprofLocalProfiler, sysprof_local_profiler, G_TYPE_OBJ enum { PROP_0, + PROP_INHERIT_STDIN, N_PROPS, PROP_ELAPSED, @@ -127,6 +131,8 @@ enum { PROP_WHOLE_SYSTEM, }; +static GParamSpec *properties [N_PROPS]; + static inline gint _g_ptr_array_find (GPtrArray *ar, gpointer item) @@ -318,6 +324,10 @@ sysprof_local_profiler_get_property (GObject *object, switch (prop_id) { + case PROP_INHERIT_STDIN: + g_value_set_boolean (value, priv->inherit_stdin); + break; + case PROP_ELAPSED: g_value_set_double (value, priv->timer ? g_timer_elapsed (priv->timer, NULL) : 0.0); break; @@ -370,6 +380,10 @@ sysprof_local_profiler_set_property (GObject *object, switch (prop_id) { + case PROP_INHERIT_STDIN: + sysprof_local_profiler_set_inherit_stdin (self, g_value_get_boolean (value)); + break; + case PROP_WHOLE_SYSTEM: priv->whole_system = g_value_get_boolean (value); break; @@ -422,6 +436,24 @@ sysprof_local_profiler_class_init (SysprofLocalProfilerClass *klass) g_object_class_override_property (object_class, PROP_SPAWN_INHERIT_ENVIRON, "spawn-inherit-environ"); g_object_class_override_property (object_class, PROP_WHOLE_SYSTEM, "whole-system"); + /** + * SysprofLocalProfiler:inherit-stdin: + * + * Sets the profiler to inherit stdin from the calling process when spawning + * the subprocess. This has no effect if the #SysprofLocalProfiler is not + * responsible for spawning the process. + * + * Since: 3.46 + */ + properties [PROP_INHERIT_STDIN] = + g_param_spec_boolean ("inherit-stdin", + "Inherit Stdin", + "If stdin of the calling process should be inherited by the spawned process", + FALSE, + (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); + + g_object_class_install_properties (object_class, N_PROPS, properties); + g_type_ensure (SYSPROF_TYPE_GJS_SOURCE); #ifdef __linux__ g_type_ensure (SYSPROF_TYPE_HOSTINFO_SOURCE); @@ -561,8 +593,12 @@ sysprof_local_profiler_start_after_auth (SysprofLocalProfiler *self) g_autoptr(GPtrArray) env = g_ptr_array_new_with_free_func (g_free); g_autoptr(SysprofSpawnable) spawnable = sysprof_spawnable_new (); g_autoptr(GSubprocess) subprocess = NULL; + GSubprocessFlags flags = 0; GPid pid; + if (priv->inherit_stdin) + flags |= G_SUBPROCESS_FLAGS_STDIN_INHERIT; + if (priv->spawn_inherit_environ) { gchar **environ_ = g_get_environ (); @@ -1090,3 +1126,40 @@ sysprof_local_profiler_new_replay (SysprofCaptureReader *reader) return SYSPROF_PROFILER (g_steal_pointer (&self)); } + +/** + * sysprof_local_profiler_get_inherit_stdin: + * + * Since: 3.46 + */ +gboolean +sysprof_local_profiler_get_inherit_stdin (SysprofLocalProfiler *self) +{ + SysprofLocalProfilerPrivate *priv = sysprof_local_profiler_get_instance_private (self); + + g_return_val_if_fail (SYSPROF_IS_LOCAL_PROFILER (self), FALSE); + + return priv->inherit_stdin; +} + +/** + * sysprof_local_profiler_set_inherit_stdin: + * + * Since: 3.46 + */ +void +sysprof_local_profiler_set_inherit_stdin (SysprofLocalProfiler *self, + gboolean inherit_stdin) +{ + SysprofLocalProfilerPrivate *priv = sysprof_local_profiler_get_instance_private (self); + + g_return_if_fail (SYSPROF_IS_LOCAL_PROFILER (self)); + + inherit_stdin = !!inherit_stdin; + + if (priv->inherit_stdin != inherit_stdin) + { + priv->inherit_stdin = inherit_stdin; + g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_INHERIT_STDIN]); + } +} diff --git a/src/libsysprof/sysprof-local-profiler.h b/src/libsysprof/sysprof-local-profiler.h index 62e7a69c..469f93c8 100644 --- a/src/libsysprof/sysprof-local-profiler.h +++ b/src/libsysprof/sysprof-local-profiler.h @@ -41,8 +41,11 @@ struct _SysprofLocalProfilerClass }; SYSPROF_AVAILABLE_IN_ALL -SysprofProfiler *sysprof_local_profiler_new (void); +SysprofProfiler *sysprof_local_profiler_new (void); SYSPROF_AVAILABLE_IN_ALL -SysprofProfiler *sysprof_local_profiler_new_replay (SysprofCaptureReader *reader); +SysprofProfiler *sysprof_local_profiler_new_replay (SysprofCaptureReader *reader); +SYSPROF_AVAILABLE_IN_3_46 +void sysprof_local_profiler_set_inherit_stdin (SysprofLocalProfiler *self, + gboolean inherit_stdin); G_END_DECLS