[gnome-shell/wip/chergert/gjs-trace-fd: 19/19] main: setup GJS profiler when GJS_TRACE_FD is set



commit 49a2e79b115c6af8b9559a7392fef90c3df6179d
Author: Christian Hergert <chergert redhat com>
Date:   Wed Jun 5 16:12:47 2019 -0700

    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 ());


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]