[evolution] Enhance workaround for bug 737949



commit ee41f10995fba49913351ab5b9f5d91c414f4b3e
Author: Milan Crha <mcrha redhat com>
Date:   Fri Jan 15 11:46:31 2016 +0100

    Enhance workaround for bug 737949
    
    Not precisely an issue of the evolution, as it uses to be with workarounds,
    but better to catch it here, when it's possible. This avoids crash of
    the evolution on quit of the second instance and some critical warnings,
    while still not leaking the EShell instance.

 shell/e-shell.c |   36 ++++++++++++++++++++++++++++++++++++
 shell/e-shell.h |    1 +
 shell/main.c    |    6 ++++--
 3 files changed, 41 insertions(+), 2 deletions(-)
---
diff --git a/shell/e-shell.c b/shell/e-shell.c
index 31fddf9..d7db1d2 100644
--- a/shell/e-shell.c
+++ b/shell/e-shell.c
@@ -87,6 +87,7 @@ struct _EShellPrivate {
        guint quit_cancelled : 1;
        guint ready_to_quit : 1;
        guint safe_mode : 1;
+       guint requires_shutdown : 1;
 };
 
 enum {
@@ -1485,6 +1486,15 @@ shell_constructed (GObject *object)
 static void
 shell_startup (GApplication *application)
 {
+       EShell *shell;
+
+       g_return_if_fail (E_IS_SHELL (application));
+
+       shell = E_SHELL (application);
+       g_warn_if_fail (!shell->priv->requires_shutdown);
+
+       shell->priv->requires_shutdown = TRUE;
+
        e_file_lock_create ();
 
        /* Destroy the lock file when the EShell is finalized
@@ -1501,6 +1511,23 @@ shell_startup (GApplication *application)
 }
 
 static void
+shell_shutdown (GApplication *application)
+{
+       EShell *shell;
+
+       g_return_if_fail (E_IS_SHELL (application));
+
+       shell = E_SHELL (application);
+
+       g_warn_if_fail (shell->priv->requires_shutdown);
+
+       shell->priv->requires_shutdown = FALSE;
+
+       /* Chain up to parent's method. */
+       G_APPLICATION_CLASS (e_shell_parent_class)->shutdown (application);
+}
+
+static void
 shell_activate (GApplication *application)
 {
        GList *list;
@@ -1633,6 +1660,7 @@ e_shell_class_init (EShellClass *class)
 
        application_class = G_APPLICATION_CLASS (class);
        application_class->startup = shell_startup;
+       application_class->shutdown = shell_shutdown;
        application_class->activate = shell_activate;
 
        gtk_application_class = GTK_APPLICATION_CLASS (class);
@@ -1942,6 +1970,7 @@ e_shell_init (EShell *shell)
        shell->priv->backends_by_name = backends_by_name;
        shell->priv->backends_by_scheme = backends_by_scheme;
        shell->priv->safe_mode = e_file_lock_exists ();
+       shell->priv->requires_shutdown = FALSE;
 
        /* Add our icon directory to the theme's search path
         * here instead of in main() so Anjal picks it up. */
@@ -2697,3 +2726,10 @@ e_shell_cancel_quit (EShell *shell)
        g_signal_stop_emission (shell, signals[QUIT_REQUESTED], 0);
 }
 
+gboolean
+e_shell_requires_shutdown (EShell *shell)
+{
+       g_return_val_if_fail (E_IS_SHELL (shell), FALSE);
+
+       return shell->priv->requires_shutdown;
+}
diff --git a/shell/e-shell.h b/shell/e-shell.h
index 1d336e2..510d627 100644
--- a/shell/e-shell.h
+++ b/shell/e-shell.h
@@ -146,6 +146,7 @@ void                e_shell_event                   (EShell *shell,
 gboolean       e_shell_quit                    (EShell *shell,
                                                 EShellQuitReason reason);
 void           e_shell_cancel_quit             (EShell *shell);
+gboolean       e_shell_requires_shutdown       (EShell *shell);
 
 G_END_DECLS
 
diff --git a/shell/main.c b/shell/main.c
index 211203c..b0ccd2f 100644
--- a/shell/main.c
+++ b/shell/main.c
@@ -654,8 +654,10 @@ main (gint argc,
        gtk_main ();
 
 exit:
-       /* Workaround https://bugzilla.gnome.org/show_bug.cgi?id=737949 */
-       g_signal_emit_by_name (shell, "shutdown");
+       if (e_shell_requires_shutdown (shell)) {
+               /* Workaround https://bugzilla.gnome.org/show_bug.cgi?id=737949 */
+               g_signal_emit_by_name (shell, "shutdown");
+       }
 
        /* Drop what should be the last reference to the shell.
         * That will cause e_shell_get_default() to henceforth


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