[gnome-shell] main: Destroy GjsContext before exit



commit 83005e27da264733b54a30df580d6379253cfd62
Author: Philip Chimento <philip endlessm com>
Date:   Mon Dec 5 17:31:08 2016 -0800

    main: Destroy GjsContext before exit
    
    This will be required in the upcoming version of GJS.
    
    The reference count on ShellGlobal is 2 at this point, because JS holds a
    reference due to the "window.global = Shell.Global.get()" line in
    ui/environment.js. Therefore, destroy the GjsContext first, then unref
    the ShellGlobal object.
    
    Cleaning up ShellGlobal was previously only enabled behind a debug
    environment variable, but it should be required now.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=775374

 src/main.c                 |    9 +++------
 src/shell-global-private.h |    2 ++
 src/shell-global.c         |   16 +++++++++++++++-
 3 files changed, 20 insertions(+), 7 deletions(-)
---
diff --git a/src/main.c b/src/main.c
index 25d2778..c88f046 100644
--- a/src/main.c
+++ b/src/main.c
@@ -469,12 +469,9 @@ main (int argc, char **argv)
 
   ecode = meta_run ();
 
-  if (g_getenv ("GNOME_SHELL_ENABLE_CLEANUP"))
-    {
-      g_printerr ("Doing final cleanup...\n");
-      g_object_unref (shell_global_get ());
-    }
-
+  g_debug ("Doing final cleanup");
+  _shell_global_destroy_gjs_context (shell_global_get ());
+  g_object_unref (shell_global_get ());
   g_object_unref (sender);
 
   return ecode;
diff --git a/src/shell-global-private.h b/src/shell-global-private.h
index 786719f..df53236 100644
--- a/src/shell-global-private.h
+++ b/src/shell-global-private.h
@@ -11,6 +11,8 @@ void _shell_global_init            (const char *first_property_name,
 void _shell_global_set_plugin      (ShellGlobal  *global,
                                     MetaPlugin   *plugin);
 
+void        _shell_global_destroy_gjs_context (ShellGlobal  *global);
+
 GjsContext *_shell_global_get_gjs_context (ShellGlobal  *global);
 
 gboolean _shell_global_check_xdnd_event (ShellGlobal  *global,
diff --git a/src/shell-global.c b/src/shell-global.c
index 6dda352..3f9ee8d 100644
--- a/src/shell-global.c
+++ b/src/shell-global.c
@@ -338,7 +338,7 @@ shell_global_finalize (GObject *object)
 {
   ShellGlobal *global = SHELL_GLOBAL (object);
 
-  g_object_unref (global->js_context);
+  g_clear_object (&global->js_context);
   g_object_unref (global->settings);
 
   the_object = NULL;
@@ -566,6 +566,20 @@ shell_global_get (void)
   return the_object;
 }
 
+/**
+ * _shell_global_destroy_gjs_context: (skip)
+ * @self: global object
+ *
+ * Destroys the GjsContext held by ShellGlobal, in order to break reference
+ * counting cycles. (The GjsContext holds a reference to ShellGlobal because
+ * it's available as window.global inside JS.)
+ */
+void
+_shell_global_destroy_gjs_context (ShellGlobal *self)
+{
+  g_clear_object (&self->js_context);
+}
+
 static guint32
 get_current_time_maybe_roundtrip (ShellGlobal *global)
 {


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