[evolution] SpamAssassin: Try harder to kill spamd on exit.
- From: Matthew Barnes <mbarnes src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution] SpamAssassin: Try harder to kill spamd on exit.
- Date: Thu, 14 Jul 2011 17:56:20 +0000 (UTC)
commit 794bc489206ab19a6f819f2fdf477fbcf8109d23
Author: Matthew Barnes <mbarnes redhat com>
Date: Thu Jul 14 13:50:30 2011 -0400
SpamAssassin: Try harder to kill spamd on exit.
References to EMailSession are leaking like crazy, so the module's
finalize() method never gets called, and we never kill our spamd.
Until I can track down all the reference leaks, kill the spamd process
in response to a "EShell::prepare-for-quit" signal instead of from the
module's finalize() method. (Maybe that's a better long-term solution
anyway?)
modules/spamassassin/evolution-spamassassin.c | 91 ++++++++++++++----------
1 files changed, 53 insertions(+), 38 deletions(-)
---
diff --git a/modules/spamassassin/evolution-spamassassin.c b/modules/spamassassin/evolution-spamassassin.c
index 1fcd369..10cb308 100644
--- a/modules/spamassassin/evolution-spamassassin.c
+++ b/modules/spamassassin/evolution-spamassassin.c
@@ -23,6 +23,7 @@
#include <camel/camel.h>
+#include <shell/e-shell.h>
#include <e-util/e-mktemp.h>
#include <e-util/gconf-bridge.h>
#include <mail/e-mail-junk-filter.h>
@@ -512,6 +513,49 @@ spam_assassin_test_spamd_running (ESpamAssassin *extension,
return (exit_code == 0);
}
+static void
+spam_assassin_kill_our_own_daemon (ESpamAssassin *extension)
+{
+ gint pid;
+ gchar *contents = NULL;
+ GError *error = NULL;
+
+ g_mutex_lock (extension->socket_path_mutex);
+
+ g_free (extension->socket_path);
+ extension->socket_path = NULL;
+
+ g_mutex_unlock (extension->socket_path_mutex);
+
+ if (extension->pid_file == NULL)
+ return;
+
+ g_file_get_contents (extension->pid_file, &contents, NULL, &error);
+
+ if (error != NULL) {
+ g_warn_if_fail (contents == NULL);
+ g_warning ("%s", error->message);
+ g_error_free (error);
+ return;
+ }
+
+ g_return_if_fail (contents != NULL);
+
+ pid = atoi (contents);
+ g_free (contents);
+
+ if (pid > 0 && kill (pid, SIGTERM) == 0)
+ waitpid (pid, NULL, 0);
+}
+
+static void
+spam_assassin_prepare_for_quit (EShell *shell,
+ EActivity *activity,
+ ESpamAssassin *extension)
+{
+ spam_assassin_kill_our_own_daemon (extension);
+}
+
static gboolean
spam_assassin_start_our_own_daemon (ESpamAssassin *extension)
{
@@ -571,6 +615,15 @@ spam_assassin_start_our_own_daemon (ESpamAssassin *extension)
g_free (extension->socket_path);
extension->socket_path = socket_path;
socket_path = NULL;
+
+ /* XXX EMailSession is too prone to reference leaks to leave
+ * this for our finalize() method. We want to be sure to
+ * kill the spamd process we started when Evolution shuts
+ * down, so connect to an EShell signal instead. */
+ g_signal_connect (
+ e_shell_get_default (), "prepare-for-quit",
+ G_CALLBACK (spam_assassin_prepare_for_quit),
+ extension);
}
exit:
@@ -583,41 +636,6 @@ exit:
}
static void
-spam_assassin_kill_our_own_daemon (ESpamAssassin *extension)
-{
- gint pid;
- gchar *contents = NULL;
- GError *error = NULL;
-
- g_mutex_lock (extension->socket_path_mutex);
-
- g_free (extension->socket_path);
- extension->socket_path = NULL;
-
- g_mutex_unlock (extension->socket_path_mutex);
-
- if (extension->pid_file == NULL)
- return;
-
- g_file_get_contents (extension->pid_file, &contents, NULL, &error);
-
- if (error != NULL) {
- g_warn_if_fail (contents == NULL);
- g_warning ("%s", error->message);
- g_error_free (error);
- return;
- }
-
- g_return_if_fail (contents != NULL);
-
- pid = atoi (contents);
- g_free (contents);
-
- if (pid > 0 && kill (pid, SIGTERM) == 0)
- waitpid (pid, NULL, 0);
-}
-
-static void
spam_assassin_test_spamd (ESpamAssassin *extension)
{
const gchar *spamd_binary;
@@ -764,9 +782,6 @@ spam_assassin_finalize (GObject *object)
{
ESpamAssassin *extension = E_SPAM_ASSASSIN (object);
- /* If we started our own daemon, kill it. */
- spam_assassin_kill_our_own_daemon (extension);
-
g_mutex_free (extension->socket_path_mutex);
g_free (extension->pid_file);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]