[gnome-shell] main: Destroy GjsContext before exit
- From: Philip Chimento <pchimento src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] main: Destroy GjsContext before exit
- Date: Wed, 7 Dec 2016 19:35:16 +0000 (UTC)
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]