[evolution-data-server/f21] Add patch for GNOME bug 733081 (IMAPx job stuck with IDLE)

Milan Crha mcrha at fedoraproject.org
Wed Jul 16 15:11:40 UTC 2014


commit 47377e53ede4874eca92d1c041e303257e960a30
Author: Milan Crha <mcrha at redhat.com>
Date:   Wed Jul 16 17:10:27 2014 +0200

    Add patch for GNOME bug 733081 (IMAPx job stuck with IDLE)

 ...a-server-3.12.4-imapx-job-stuck-with-idle.patch |  185 ++++++++++++++++++++
 evolution-data-server.spec                         |    9 +-
 2 files changed, 193 insertions(+), 1 deletions(-)
---
diff --git a/evolution-data-server-3.12.4-imapx-job-stuck-with-idle.patch b/evolution-data-server-3.12.4-imapx-job-stuck-with-idle.patch
new file mode 100644
index 0000000..c25a86d
--- /dev/null
+++ b/evolution-data-server-3.12.4-imapx-job-stuck-with-idle.patch
@@ -0,0 +1,185 @@
+diff -up evolution-data-server-3.12.4/camel/providers/imapx/camel-imapx-server.c.imapx-job-stuck-with-idle evolution-data-server-3.12.4/camel/providers/imapx/camel-imapx-server.c
+--- evolution-data-server-3.12.4/camel/providers/imapx/camel-imapx-server.c.imapx-job-stuck-with-idle	2014-07-13 20:22:01.000000000 +0200
++++ evolution-data-server-3.12.4/camel/providers/imapx/camel-imapx-server.c	2014-07-16 17:09:07.400131509 +0200
+@@ -390,7 +390,7 @@ struct _CamelIMAPXServerPrivate {
+ 	gchar inbox_separator;
+ 
+ 	/* IDLE support */
+-	GMutex idle_lock;
++	GRecMutex idle_lock;
+ 	GThread *idle_thread;
+ 	GMainLoop *idle_main_loop;
+ 	GMainContext *idle_main_context;
+@@ -3054,7 +3054,7 @@ imapx_continuation (CamelIMAPXServer *is
+ 			return FALSE;
+ 
+ 		c (is->tagprefix, "Got continuation response for IDLE \n");
+-		g_mutex_lock (&is->priv->idle_lock);
++		g_rec_mutex_lock (&is->priv->idle_lock);
+ 		/* We might have actually sent the DONE already! */
+ 		if (is->priv->idle_state == IMAPX_IDLE_ISSUED)
+ 			is->priv->idle_state = IMAPX_IDLE_STARTED;
+@@ -3063,7 +3063,7 @@ imapx_continuation (CamelIMAPXServer *is
+ 			 * we were waiting for this continuation. Send DONE
+ 			 * immediately. */
+ 			if (!imapx_command_idle_stop (is, error)) {
+-				g_mutex_unlock (&is->priv->idle_lock);
++				g_rec_mutex_unlock (&is->priv->idle_lock);
+ 				return FALSE;
+ 			}
+ 			is->priv->idle_state = IMAPX_IDLE_OFF;
+@@ -3072,7 +3072,7 @@ imapx_continuation (CamelIMAPXServer *is
+ 				is->tagprefix, "idle starts in wrong state %d\n",
+ 				is->priv->idle_state);
+ 		}
+-		g_mutex_unlock (&is->priv->idle_lock);
++		g_rec_mutex_unlock (&is->priv->idle_lock);
+ 
+ 		QUEUE_LOCK (is);
+ 		is->literal = NULL;
+@@ -3548,9 +3548,9 @@ imapx_command_idle_done (CamelIMAPXServe
+ 		camel_imapx_job_take_error (job, local_error);
+ 	}
+ 
+-	g_mutex_lock (&is->priv->idle_lock);
++	g_rec_mutex_lock (&is->priv->idle_lock);
+ 	is->priv->idle_state = IMAPX_IDLE_OFF;
+-	g_mutex_unlock (&is->priv->idle_lock);
++	g_rec_mutex_unlock (&is->priv->idle_lock);
+ 
+ 	imapx_unregister_job (is, job);
+ }
+@@ -3579,29 +3579,23 @@ imapx_job_idle_start (CamelIMAPXJob *job
+ 	cp = g_queue_peek_head (&ic->parts);
+ 	cp->type |= CAMEL_IMAPX_COMMAND_CONTINUATION;
+ 
+-	g_mutex_lock (&is->priv->idle_lock);
++	QUEUE_LOCK (is);
++	g_rec_mutex_lock (&is->priv->idle_lock);
+ 	/* Don't issue it if the idle was cancelled already */
+ 	if (is->priv->idle_state == IMAPX_IDLE_PENDING) {
+ 		is->priv->idle_state = IMAPX_IDLE_ISSUED;
+-		g_mutex_unlock (&is->priv->idle_lock);
+ 
+-		QUEUE_LOCK (is);
+-		/* It can be that another thread started a command between
+-		   the two locks above had been interchanged, thus also test
+-		   whether the active command queue is empty, before starting
+-		   the IDLE command. */
+ 		if (camel_imapx_command_queue_is_empty (is->active)) {
+ 			imapx_command_start (is, ic);
+ 		} else {
+ 			c (is->tagprefix, "finally cancelling IDLE, other command was quicker\n");
++			is->priv->idle_state = IMAPX_IDLE_OFF;
+ 			imapx_unregister_job (is, job);
+ 		}
+ 	} else {
+-		g_mutex_unlock (&is->priv->idle_lock);
+-
+-		QUEUE_LOCK (is);
+ 		imapx_unregister_job (is, job);
+ 	}
++	g_rec_mutex_unlock (&is->priv->idle_lock);
+ 	QUEUE_UNLOCK (is);
+ 
+ 	camel_imapx_command_unref (ic);
+@@ -3690,10 +3684,10 @@ imapx_call_idle (gpointer data)
+ 		goto exit;
+ 
+ 	/* XXX Rename to 'pending_lock'? */
+-	g_mutex_lock (&is->priv->idle_lock);
++	g_rec_mutex_lock (&is->priv->idle_lock);
+ 	g_source_unref (is->priv->idle_pending);
+ 	is->priv->idle_pending = NULL;
+-	g_mutex_unlock (&is->priv->idle_lock);
++	g_rec_mutex_unlock (&is->priv->idle_lock);
+ 
+ 	if (is->priv->idle_state != IMAPX_IDLE_PENDING)
+ 		goto exit;
+@@ -3765,7 +3759,7 @@ imapx_idle_thread (gpointer data)
+ 	 *     regressions.
+ 	 */
+ 
+-	g_mutex_lock (&is->priv->idle_lock);
++	g_rec_mutex_lock (&is->priv->idle_lock);
+ 
+ 	g_warn_if_fail (is->priv->idle_pending == NULL);
+ 	pending = g_timeout_source_new_seconds (IMAPX_IDLE_DWELL_TIME);
+@@ -3778,7 +3772,7 @@ imapx_idle_thread (gpointer data)
+ 	is->priv->idle_pending = g_source_ref (pending);
+ 	g_source_unref (pending);
+ 
+-	g_mutex_unlock (&is->priv->idle_lock);
++	g_rec_mutex_unlock (&is->priv->idle_lock);
+ 
+ 	g_main_loop_run (is->priv->idle_main_loop);
+ 
+@@ -3798,7 +3792,7 @@ imapx_stop_idle (CamelIMAPXServer *is,
+ 
+ 	time (&now);
+ 
+-	g_mutex_lock (&is->priv->idle_lock);
++	g_rec_mutex_lock (&is->priv->idle_lock);
+ 
+ 	switch (is->priv->idle_state) {
+ 		case IMAPX_IDLE_ISSUED:
+@@ -3827,7 +3821,7 @@ imapx_stop_idle (CamelIMAPXServer *is,
+ 	}
+ 
+ exit:
+-	g_mutex_unlock (&is->priv->idle_lock);
++	g_rec_mutex_unlock (&is->priv->idle_lock);
+ 
+ 	return result;
+ }
+@@ -3838,7 +3832,7 @@ imapx_start_idle (CamelIMAPXServer *is)
+ 	if (camel_application_is_exiting)
+ 		return;
+ 
+-	g_mutex_lock (&is->priv->idle_lock);
++	g_rec_mutex_lock (&is->priv->idle_lock);
+ 
+ 	g_return_if_fail (is->priv->idle_state == IMAPX_IDLE_OFF);
+ 	is->priv->idle_state = IMAPX_IDLE_PENDING;
+@@ -3861,7 +3855,7 @@ imapx_start_idle (CamelIMAPXServer *is)
+ 		g_source_unref (pending);
+ 	}
+ 
+-	g_mutex_unlock (&is->priv->idle_lock);
++	g_rec_mutex_unlock (&is->priv->idle_lock);
+ }
+ 
+ static gboolean
+@@ -3869,12 +3863,12 @@ imapx_in_idle (CamelIMAPXServer *is)
+ {
+ 	gboolean in_idle = FALSE;
+ 
+-	g_mutex_lock (&is->priv->idle_lock);
++	g_rec_mutex_lock (&is->priv->idle_lock);
+ 
+ 	if (is->priv->idle_thread != NULL)
+ 		in_idle = (is->priv->idle_state > IMAPX_IDLE_OFF);
+ 
+-	g_mutex_unlock (&is->priv->idle_lock);
++	g_rec_mutex_unlock (&is->priv->idle_lock);
+ 
+ 	return in_idle;
+ }
+@@ -7809,7 +7803,7 @@ imapx_server_finalize (GObject *object)
+ 	g_hash_table_destroy (is->priv->known_alerts);
+ 	g_mutex_clear (&is->priv->known_alerts_lock);
+ 
+-	g_mutex_clear (&is->priv->idle_lock);
++	g_rec_mutex_clear (&is->priv->idle_lock);
+ 	g_main_loop_unref (is->priv->idle_main_loop);
+ 	g_main_context_unref (is->priv->idle_main_context);
+ 
+@@ -7993,7 +7987,7 @@ camel_imapx_server_init (CamelIMAPXServe
+ 
+ 	main_context = g_main_context_new ();
+ 
+-	g_mutex_init (&is->priv->idle_lock);
++	g_rec_mutex_init (&is->priv->idle_lock);
+ 	is->priv->idle_main_loop = g_main_loop_new (main_context, FALSE);
+ 	is->priv->idle_main_context = g_main_context_ref (main_context);
+ 
diff --git a/evolution-data-server.spec b/evolution-data-server.spec
index 8915455..041a309 100644
--- a/evolution-data-server.spec
+++ b/evolution-data-server.spec
@@ -32,7 +32,7 @@
 
 Name: evolution-data-server
 Version: 3.12.4
-Release: 1%{?dist}
+Release: 2%{?dist}
 Group: System Environment/Libraries
 Summary: Backend data server for Evolution
 License: LGPLv2+
@@ -48,6 +48,9 @@ Obsoletes: evolution-webcal < 2.24.0
 # RH bug #243296
 Patch01: evolution-data-server-1.11.5-fix-64bit-acinclude.patch
 
+# GNOME bug #733081
+Patch02: evolution-data-server-3.12.4-imapx-job-stuck-with-idle.patch
+
 ### Dependencies ###
 
 Requires: dconf
@@ -135,6 +138,7 @@ This package contains developer documentation for %{name}.
 %setup -q
 
 %patch01 -p1 -b .fix-64bit-acinclude
+%patch02 -p1 -b .imapx-job-stuck-with-idle
 
 %build
 %if %{ldap_support}
@@ -382,6 +386,9 @@ glib-compile-schemas %{_datadir}/glib-2.0/schemas &>/dev/null || :
 %endif
 
 %changelog
+* Wed Jul 16 2014 Milan Crha <mcrha at redhat.com> - 3.12.4-2
+- Add patch for GNOME bug 733081 (IMAPx job stuck with IDLE)
+
 * Mon Jul 14 2014 Milan Crha <mcrha at redhat.com> - 3.12.4-1
 - Update to 3.12.4
 


More information about the scm-commits mailing list