From ba05eccc8d0595fd229a25b5a62f302abe7ef479 Mon Sep 17 00:00:00 2001 From: Matthew Barnes Date: Wed, 2 Dec 2009 16:49:44 -0500 Subject: Revise the EShell ref-leak check to not upset Valgrind. --- shell/e-shell.c | 11 +++++------ shell/main.c | 24 +++++++++++------------- 2 files changed, 16 insertions(+), 19 deletions(-) diff --git a/shell/e-shell.c b/shell/e-shell.c index 130e0f0912..157e003799 100644 --- a/shell/e-shell.c +++ b/shell/e-shell.c @@ -91,8 +91,8 @@ static GDebugKey debug_keys[] = { { "settings", DEBUG_KEY_SETTINGS } }; -EShell *default_shell = NULL; static gpointer parent_class; +static gpointer default_shell; static guint signals[LAST_SIGNAL]; #if defined(NM_SUPPORT) && NM_SUPPORT @@ -624,8 +624,10 @@ static void shell_constructed (GObject *object) { /* The first EShell instance is the default. */ - if (default_shell == NULL) - default_shell = g_object_ref (object); + if (default_shell == NULL) { + default_shell = object; + g_object_add_weak_pointer (object, &default_shell); + } /* UniqueApp will have by this point determined whether we're * the only Evolution process running. If so, proceed normally. @@ -1148,9 +1150,6 @@ e_shell_get_type (void) EShell * e_shell_get_default (void) { - /* Emit a warning if we call this too early. */ - g_return_val_if_fail (default_shell != NULL, NULL); - return default_shell; } diff --git a/shell/main.c b/shell/main.c index c1a4e5decf..81a6a81540 100644 --- a/shell/main.c +++ b/shell/main.c @@ -93,9 +93,6 @@ static gchar *requested_view = NULL; static gchar *evolution_debug_log = NULL; static gchar **remaining_args; -/* Defined in */ -extern EShell *default_shell; - static void categories_icon_theme_hack (void) { @@ -397,7 +394,7 @@ shell_force_shutdown (void) g_assert_not_reached (); } -static void +static EShell * create_default_shell (void) { EShell *shell; @@ -441,11 +438,9 @@ create_default_shell (void) g_object_unref (client); - /* EShell keeps its own reference to the first instance for use - * in e_shell_get_default(), so it's safe to unreference here. */ - g_object_unref (shell); - g_idle_add ((GSourceFunc) idle_cb, remaining_args); + + return shell; } #ifdef G_OS_WIN32 @@ -455,6 +450,7 @@ extern void link_shutdown (void); gint main (gint argc, gchar **argv) { + EShell *shell; GtkIconTheme *icon_theme; GConfClient *client; #ifdef DEVELOPMENT @@ -580,7 +576,7 @@ main (gint argc, gchar **argv) g_object_unref (client); - create_default_shell (); + shell = create_default_shell (); if (!disable_eplugin) { /* Register built-in plugin hook types. */ @@ -597,14 +593,16 @@ main (gint argc, gchar **argv) /* Attempt migration -after- loading all modules and plugins, * as both shell backends and certain plugins hook into this. */ - e_shell_migrate_attempt (default_shell); + e_shell_migrate_attempt (shell); gtk_main (); /* Drop what should be the last reference to the shell. - * Emit a warning if references are leaking somewhere. */ - g_object_unref (default_shell); - if (E_IS_SHELL (default_shell)) + * That will cause e_shell_get_default() to henceforth + * return NULL. Use that to check for reference leaks. */ + g_object_unref (shell); + + if (e_shell_get_default () != NULL) g_warning ("Shell not finalized on exit"); gtk_accel_map_save (e_get_accels_filename ()); -- cgit v1.2.3