From 751cd2f1c17a5f909871518a0f9cf7f9307a8ef5 Mon Sep 17 00:00:00 2001 From: Christian Hergert Date: Wed, 5 Jun 2019 16:12:47 -0700 Subject: [PATCH] main: setup GJS profiler when GJS_TRACE_FD is set This is the same environment variable that will be used in GJS to auto- connect Sysprof to the GJS profiler when the gjs binary is used. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/573 --- meson.build | 2 +- src/main.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 1 deletion(-) diff --git a/meson.build b/meson.build index ef52ef33e..69ea05c90 100644 --- a/meson.build +++ b/meson.build @@ -20,7 +20,7 @@ gcr_req = '>= 3.7.5' gdesktop_req = '>= 3.7.90' gio_req = '>= 2.56.0' gi_req = '>= 1.49.1' -gjs_req = '>= 1.57.2' +gjs_req = '>= 1.57.3' gtk_req = '>= 3.15.0' json_glib_req = '>= 0.13.2' mutter_req = '>= 3.33.2' diff --git a/src/main.c b/src/main.c index 245837783..8d144aac6 100644 --- a/src/main.c +++ b/src/main.c @@ -198,6 +198,62 @@ shell_fonts_init (void) cogl_pango_font_map_set_use_mipmapping (fontmap, FALSE); } +static void +shell_profiler_init (void) +{ + ShellGlobal *global; + GjsProfiler *profiler; + GjsContext *context; + const char *enabled; + const char *fd_str; + int fd = -1; + + /* Sysprof uses the "GJS_TRACE_FD=N" environment variable to connect GJS + * profiler data to the combined Sysprof capture. Since we are in control of + * the GjsContext, we need to proxy this FD across to the GJS profiler. + */ + + fd_str = g_getenv ("GJS_TRACE_FD"); + enabled = g_getenv ("GJS_ENABLE_PROFILER"); + if (fd_str == NULL || enabled == NULL) + return; + + global = shell_global_get (); + g_return_if_fail (global); + + context = _shell_global_get_gjs_context (global); + g_return_if_fail (context); + + profiler = gjs_context_get_profiler (context); + g_return_if_fail (profiler); + + if (fd_str) + { + fd = atoi (fd_str); + + if (fd > 2) + { + gjs_profiler_set_fd (profiler, fd); + gjs_profiler_start (profiler); + } + } +} + +static void +shell_profiler_shutdown (void) +{ + ShellGlobal *global; + GjsProfiler *profiler; + GjsContext *context; + + global = shell_global_get (); + context = _shell_global_get_gjs_context (global); + profiler = gjs_context_get_profiler (context); + + if (profiler) + gjs_profiler_stop (profiler); +} + static void malloc_statistics_callback (ShellPerfLog *perf_log, gpointer data) @@ -496,7 +552,9 @@ main (int argc, char **argv) dump_gjs_stack_on_signal (SIGSEGV); } + shell_profiler_init (); ecode = meta_run (); + shell_profiler_shutdown (); g_debug ("Doing final cleanup"); _shell_global_destroy_gjs_context (shell_global_get ());