mirror of
https://github.com/varun-r-mallya/sysprof.git
synced 2026-02-12 16:10:54 +00:00
libsysprof: add vfunc to modify spawn arguments
This commit is contained in:
@ -467,6 +467,25 @@ sysprof_local_profiler_finish_startup (SysprofLocalProfiler *self)
|
|||||||
sysprof_local_profiler_stop (SYSPROF_PROFILER (self));
|
sysprof_local_profiler_stop (SYSPROF_PROFILER (self));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
sysprof_local_profiler_wait_cb (GObject *object,
|
||||||
|
GAsyncResult *result,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
GSubprocess *subprocess = (GSubprocess *)object;
|
||||||
|
g_autoptr(SysprofLocalProfiler) self = user_data;
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
|
||||||
|
g_assert (G_IS_SUBPROCESS (subprocess));
|
||||||
|
g_assert (G_IS_ASYNC_RESULT (result));
|
||||||
|
g_assert (SYSPROF_IS_LOCAL_PROFILER (self));
|
||||||
|
|
||||||
|
if (!g_subprocess_wait_finish (subprocess, result, &error))
|
||||||
|
g_warning ("Wait on subprocess failed: %s", error->message);
|
||||||
|
|
||||||
|
sysprof_local_profiler_stop (SYSPROF_PROFILER (self));
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
sysprof_local_profiler_authorize_cb (GObject *object,
|
sysprof_local_profiler_authorize_cb (GObject *object,
|
||||||
GAsyncResult *result,
|
GAsyncResult *result,
|
||||||
@ -521,7 +540,10 @@ sysprof_local_profiler_authorize_cb (GObject *object,
|
|||||||
|
|
||||||
if (priv->spawn && priv->spawn_argv && priv->spawn_argv[0])
|
if (priv->spawn && priv->spawn_argv && priv->spawn_argv[0])
|
||||||
{
|
{
|
||||||
g_autoptr(GPtrArray) ar = g_ptr_array_new_with_free_func (g_free);
|
g_autoptr(GPtrArray) env = g_ptr_array_new_with_free_func (g_free);
|
||||||
|
g_autoptr(GPtrArray) argv = g_ptr_array_new_with_free_func (g_free);
|
||||||
|
g_autoptr(GSubprocessLauncher) launcher = NULL;
|
||||||
|
g_autoptr(GSubprocess) subprocess = NULL;
|
||||||
GPid pid;
|
GPid pid;
|
||||||
|
|
||||||
if (priv->spawn_inherit_environ)
|
if (priv->spawn_inherit_environ)
|
||||||
@ -529,41 +551,61 @@ sysprof_local_profiler_authorize_cb (GObject *object,
|
|||||||
gchar **environ = g_get_environ ();
|
gchar **environ = g_get_environ ();
|
||||||
|
|
||||||
for (guint i = 0; environ[i]; i++)
|
for (guint i = 0; environ[i]; i++)
|
||||||
g_ptr_array_add (ar, environ[i]);
|
g_ptr_array_add (env, environ[i]);
|
||||||
g_free (environ);
|
g_free (environ);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->spawn_env)
|
if (priv->spawn_env)
|
||||||
{
|
{
|
||||||
for (guint i = 0; priv->spawn_env[i]; i++)
|
for (guint i = 0; priv->spawn_env[i]; i++)
|
||||||
g_ptr_array_add (ar, g_strdup (priv->spawn_env[i]));
|
g_ptr_array_add (env, g_strdup (priv->spawn_env[i]));
|
||||||
}
|
}
|
||||||
|
|
||||||
g_ptr_array_add (ar, NULL);
|
g_ptr_array_add (env, NULL);
|
||||||
|
|
||||||
if (!g_spawn_async (g_get_home_dir (),
|
launcher = g_subprocess_launcher_new (0);
|
||||||
priv->spawn_argv,
|
g_subprocess_launcher_set_environ (launcher, (gchar **)env->pdata);
|
||||||
(gchar **)ar->pdata,
|
g_subprocess_launcher_set_cwd (launcher, g_get_home_dir ());
|
||||||
(G_SPAWN_SEARCH_PATH |
|
|
||||||
G_SPAWN_STDOUT_TO_DEV_NULL |
|
if (priv->spawn_argv)
|
||||||
G_SPAWN_STDOUT_TO_DEV_NULL),
|
{
|
||||||
NULL,
|
for (guint i = 0; priv->spawn_argv[i]; i++)
|
||||||
NULL,
|
g_ptr_array_add (argv, g_strdup (priv->spawn_argv[i]));
|
||||||
&pid,
|
}
|
||||||
&error))
|
|
||||||
g_ptr_array_add (priv->failures, g_steal_pointer (&error));
|
for (guint i = 0; i < priv->sources->len; i++)
|
||||||
|
{
|
||||||
|
SysprofSource *source = g_ptr_array_index (priv->sources, i);
|
||||||
|
sysprof_source_modify_spawn (source, launcher, argv);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_ptr_array_add (argv, NULL);
|
||||||
|
|
||||||
|
if (!(subprocess = g_subprocess_launcher_spawnv (launcher,
|
||||||
|
(const gchar * const *)argv->pdata,
|
||||||
|
&error)))
|
||||||
|
{
|
||||||
|
g_ptr_array_add (priv->failures, g_steal_pointer (&error));
|
||||||
|
}
|
||||||
else
|
else
|
||||||
g_array_append_val (priv->pids, pid);
|
{
|
||||||
|
const gchar *ident = g_subprocess_get_identifier (subprocess);
|
||||||
|
pid = atoi (ident);
|
||||||
|
g_array_append_val (priv->pids, pid);
|
||||||
|
g_subprocess_wait_async (subprocess,
|
||||||
|
NULL,
|
||||||
|
sysprof_local_profiler_wait_cb,
|
||||||
|
g_object_ref (self));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (guint i = 0; i < priv->sources->len; i++)
|
for (guint i = 0; i < priv->sources->len; i++)
|
||||||
{
|
{
|
||||||
SysprofSource *source = g_ptr_array_index (priv->sources, i);
|
SysprofSource *source = g_ptr_array_index (priv->sources, i);
|
||||||
guint j;
|
|
||||||
|
|
||||||
if (priv->whole_system == FALSE)
|
if (priv->whole_system == FALSE)
|
||||||
{
|
{
|
||||||
for (j = 0; j < priv->pids->len; j++)
|
for (guint j = 0; j < priv->pids->len; j++)
|
||||||
{
|
{
|
||||||
GPid pid = g_array_index (priv->pids, GPid, j);
|
GPid pid = g_array_index (priv->pids, GPid, j);
|
||||||
|
|
||||||
|
|||||||
@ -139,3 +139,16 @@ sysprof_source_stop (SysprofSource *self)
|
|||||||
if (SYSPROF_SOURCE_GET_IFACE (self)->stop)
|
if (SYSPROF_SOURCE_GET_IFACE (self)->stop)
|
||||||
SYSPROF_SOURCE_GET_IFACE (self)->stop (self);
|
SYSPROF_SOURCE_GET_IFACE (self)->stop (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sysprof_source_modify_spawn (SysprofSource *self,
|
||||||
|
GSubprocessLauncher *launcher,
|
||||||
|
GPtrArray *argv)
|
||||||
|
{
|
||||||
|
g_return_if_fail (SYSPROF_IS_SOURCE (self));
|
||||||
|
g_return_if_fail (G_IS_SUBPROCESS_LAUNCHER (launcher));
|
||||||
|
g_return_if_fail (argv != NULL);
|
||||||
|
|
||||||
|
if (SYSPROF_SOURCE_GET_IFACE (self)->modify_spawn)
|
||||||
|
SYSPROF_SOURCE_GET_IFACE (self)->modify_spawn (self, launcher, argv);
|
||||||
|
}
|
||||||
|
|||||||
@ -24,7 +24,7 @@
|
|||||||
# error "Only <sysprof.h> can be included directly."
|
# error "Only <sysprof.h> can be included directly."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <glib-object.h>
|
#include <gio/gio.h>
|
||||||
|
|
||||||
#include "sysprof-capture-writer.h"
|
#include "sysprof-capture-writer.h"
|
||||||
|
|
||||||
@ -119,6 +119,19 @@ struct _SysprofSourceInterface
|
|||||||
* sysprof_source_emit_finished() must be called from the main-thread.
|
* sysprof_source_emit_finished() must be called from the main-thread.
|
||||||
*/
|
*/
|
||||||
void (*stop) (SysprofSource *self);
|
void (*stop) (SysprofSource *self);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SysprofSource::modify-spawn:
|
||||||
|
* @self: a #SysprofSource
|
||||||
|
* @launcher: a #GSubprocessLauncher
|
||||||
|
* @argv: (element-type utf8): arguments for spawning
|
||||||
|
*
|
||||||
|
* Allows the source to modify the launcher or argv before the
|
||||||
|
* process is spawned.
|
||||||
|
*/
|
||||||
|
void (*modify_spawn) (SysprofSource *self,
|
||||||
|
GSubprocessLauncher *launcher,
|
||||||
|
GPtrArray *argv);
|
||||||
};
|
};
|
||||||
|
|
||||||
SYSPROF_AVAILABLE_IN_ALL
|
SYSPROF_AVAILABLE_IN_ALL
|
||||||
@ -142,5 +155,9 @@ SYSPROF_AVAILABLE_IN_ALL
|
|||||||
void sysprof_source_start (SysprofSource *self);
|
void sysprof_source_start (SysprofSource *self);
|
||||||
SYSPROF_AVAILABLE_IN_ALL
|
SYSPROF_AVAILABLE_IN_ALL
|
||||||
void sysprof_source_stop (SysprofSource *self);
|
void sysprof_source_stop (SysprofSource *self);
|
||||||
|
SYSPROF_AVAILABLE_IN_ALL
|
||||||
|
void sysprof_source_modify_spawn (SysprofSource *self,
|
||||||
|
GSubprocessLauncher *launcher,
|
||||||
|
GPtrArray *argv);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|||||||
Reference in New Issue
Block a user