[evolution] Enhance workaround for bug 737949
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] Enhance workaround for bug 737949
- Date: Fri, 15 Jan 2016 10:49:53 +0000 (UTC)
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]