From 83005e27da264733b54a30df580d6379253cfd62 Mon Sep 17 00:00:00 2001 From: Philip Chimento Date: Mon, 5 Dec 2016 17:31:08 -0800 Subject: [PATCH] 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 25d2778d0..c88f04642 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 786719f5b..df53236aa 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 6dda3526a..3f9ee8d4f 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) {