Blame SOURCES/evolution-data-server-3.12.11-imapx-msg-download-indefinite-wait.patch

5e6360
diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c.imapx-msg-download-indefinite-wait evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c
5e6360
--- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c.imapx-msg-download-indefinite-wait	2015-06-01 21:47:39.859412175 +0200
5e6360
+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.c	2015-06-01 21:48:23.891134658 +0200
5e6360
@@ -46,6 +46,8 @@ struct _CamelIMAPXRealJob {
5e6360
 
5e6360
 	CamelIMAPXMailbox *mailbox;
5e6360
 	GMutex mailbox_lock;
5e6360
+
5e6360
+	CamelIMAPXMailbox *guard_mailbox_update; /* uses the mailbox_lock */
5e6360
 };
5e6360
 
5e6360
 static void
5e6360
@@ -124,6 +126,13 @@ camel_imapx_job_unref (CamelIMAPXJob *jo
5e6360
 		if (real_job->destroy_data != NULL)
5e6360
 			real_job->destroy_data (real_job->data);
5e6360
 
5e6360
+		g_mutex_lock (&real_job->mailbox_lock);
5e6360
+		if (real_job->guard_mailbox_update) {
5e6360
+			camel_imapx_mailbox_unlock_update (real_job->guard_mailbox_update);
5e6360
+			g_clear_object (&real_job->guard_mailbox_update);
5e6360
+		}
5e6360
+		g_mutex_unlock (&real_job->mailbox_lock);
5e6360
+
5e6360
 		g_clear_object (&real_job->mailbox);
5e6360
 		g_mutex_clear (&real_job->mailbox_lock);
5e6360
 
5e6360
@@ -232,6 +241,13 @@ camel_imapx_job_done (CamelIMAPXJob *job
5e6360
 
5e6360
 	real_job = (CamelIMAPXRealJob *) job;
5e6360
 
5e6360
+	g_mutex_lock (&real_job->mailbox_lock);
5e6360
+	if (real_job->guard_mailbox_update) {
5e6360
+		camel_imapx_mailbox_unlock_update (real_job->guard_mailbox_update);
5e6360
+		g_clear_object (&real_job->guard_mailbox_update);
5e6360
+	}
5e6360
+	g_mutex_unlock (&real_job->mailbox_lock);
5e6360
+
5e6360
 	g_mutex_lock (&real_job->done_mutex);
5e6360
 	real_job->done_flag = TRUE;
5e6360
 	g_cond_broadcast (&real_job->done_cond);
5e6360
@@ -263,6 +279,36 @@ camel_imapx_job_run (CamelIMAPXJob *job,
5e6360
 	return success;
5e6360
 }
5e6360
 
5e6360
+void
5e6360
+camel_imapx_job_guard_mailbox_update (CamelIMAPXJob *job,
5e6360
+				      CamelIMAPXMailbox *mailbox)
5e6360
+{
5e6360
+	CamelIMAPXRealJob *real_job;
5e6360
+
5e6360
+	g_return_if_fail (CAMEL_IS_IMAPX_JOB (job));
5e6360
+
5e6360
+	if (mailbox)
5e6360
+		g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox));
5e6360
+
5e6360
+	real_job = (CamelIMAPXRealJob *) job;
5e6360
+
5e6360
+	g_mutex_lock (&real_job->mailbox_lock);
5e6360
+
5e6360
+	if (mailbox != real_job->guard_mailbox_update) {
5e6360
+		if (real_job->guard_mailbox_update) {
5e6360
+			camel_imapx_mailbox_unlock_update (real_job->guard_mailbox_update);
5e6360
+			g_clear_object (&real_job->guard_mailbox_update);
5e6360
+		}
5e6360
+
5e6360
+		if (mailbox) {
5e6360
+			real_job->guard_mailbox_update = g_object_ref (mailbox);
5e6360
+			camel_imapx_mailbox_lock_update (real_job->guard_mailbox_update);
5e6360
+		}
5e6360
+	}
5e6360
+
5e6360
+	g_mutex_unlock (&real_job->mailbox_lock);
5e6360
+}
5e6360
+
5e6360
 gboolean
5e6360
 camel_imapx_job_matches (CamelIMAPXJob *job,
5e6360
                          CamelIMAPXMailbox *mailbox,
5e6360
diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h.imapx-msg-download-indefinite-wait evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h
5e6360
--- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h.imapx-msg-download-indefinite-wait	2015-06-01 21:47:45.811374376 +0200
5e6360
+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-job.h	2015-06-01 21:48:23.891134658 +0200
5e6360
@@ -64,6 +64,9 @@ void		camel_imapx_job_done		(CamelIMAPXJ
5e6360
 gboolean	camel_imapx_job_run		(CamelIMAPXJob *job,
5e6360
 						 CamelIMAPXServer *is,
5e6360
 						 GError **error);
5e6360
+void		camel_imapx_job_guard_mailbox_update
5e6360
+						(CamelIMAPXJob *job,
5e6360
+						 CamelIMAPXMailbox *mailbox);
5e6360
 gboolean	camel_imapx_job_matches		(CamelIMAPXJob *job,
5e6360
 						 CamelIMAPXMailbox *mailbox,
5e6360
 						 const gchar *uid);
5e6360
diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c.imapx-msg-download-indefinite-wait evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c
5e6360
--- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c.imapx-msg-download-indefinite-wait	2015-06-01 21:48:14.947190662 +0200
5e6360
+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-mailbox.c	2015-06-01 21:48:23.892134652 +0200
5e6360
@@ -51,7 +51,9 @@ struct _CamelIMAPXMailboxPrivate {
5e6360
 	CamelIMAPXMailboxState state;
5e6360
 
5e6360
 	GMutex property_lock;
5e6360
-	GRecMutex update_lock;
5e6360
+	GMutex update_lock;
5e6360
+	GCond update_cond;
5e6360
+	gboolean update_is_locked;
5e6360
 
5e6360
 	/* Protected by the "property_lock". */
5e6360
 	GHashTable *attributes;
5e6360
@@ -98,7 +100,8 @@ imapx_mailbox_finalize (GObject *object)
5e6360
 	g_free (priv->name);
5e6360
 
5e6360
 	g_mutex_clear (&priv->property_lock);
5e6360
-	g_rec_mutex_clear (&priv->update_lock);
5e6360
+	g_mutex_clear (&priv->update_lock);
5e6360
+	g_cond_clear (&priv->update_cond);
5e6360
 	g_hash_table_destroy (priv->attributes);
5e6360
 	g_sequence_free (priv->message_map);
5e6360
 	g_strfreev (priv->quota_roots);
5e6360
@@ -125,7 +128,9 @@ camel_imapx_mailbox_init (CamelIMAPXMail
5e6360
 	mailbox->priv = CAMEL_IMAPX_MAILBOX_GET_PRIVATE (mailbox);
5e6360
 
5e6360
 	g_mutex_init (&mailbox->priv->property_lock);
5e6360
-	g_rec_mutex_init (&mailbox->priv->update_lock);
5e6360
+	g_mutex_init (&mailbox->priv->update_lock);
5e6360
+	g_cond_init (&mailbox->priv->update_cond);
5e6360
+	mailbox->priv->update_is_locked = FALSE;
5e6360
 	mailbox->priv->message_map = g_sequence_new (NULL);
5e6360
 	mailbox->priv->permanentflags = ~0;
5e6360
 	mailbox->priv->state = CAMEL_IMAPX_MAILBOX_STATE_CREATED;
5e6360
@@ -1198,7 +1203,15 @@ camel_imapx_mailbox_lock_update (CamelIM
5e6360
 {
5e6360
 	g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox));
5e6360
 
5e6360
-	g_rec_mutex_lock (&mailbox->priv->update_lock);
5e6360
+	g_mutex_lock (&mailbox->priv->update_lock);
5e6360
+
5e6360
+	while (mailbox->priv->update_is_locked) {
5e6360
+		g_cond_wait (&mailbox->priv->update_cond, &mailbox->priv->update_lock);
5e6360
+	}
5e6360
+
5e6360
+	mailbox->priv->update_is_locked = TRUE;
5e6360
+
5e6360
+	g_mutex_unlock (&mailbox->priv->update_lock);
5e6360
 }
5e6360
 
5e6360
 /* Prevents running FETCH and STORE at the same time for the given mailbox */
5e6360
@@ -1207,5 +1220,12 @@ camel_imapx_mailbox_unlock_update (Camel
5e6360
 {
5e6360
 	g_return_if_fail (CAMEL_IS_IMAPX_MAILBOX (mailbox));
5e6360
 
5e6360
-	g_rec_mutex_unlock (&mailbox->priv->update_lock);
5e6360
+	g_mutex_lock (&mailbox->priv->update_lock);
5e6360
+
5e6360
+	if (mailbox->priv->update_is_locked) {
5e6360
+		mailbox->priv->update_is_locked = FALSE;
5e6360
+		g_cond_signal (&mailbox->priv->update_cond);
5e6360
+	}
5e6360
+
5e6360
+	g_mutex_unlock (&mailbox->priv->update_lock);
5e6360
 }
5e6360
diff -up evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.imapx-msg-download-indefinite-wait evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c
5e6360
--- evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c.imapx-msg-download-indefinite-wait	2015-06-01 21:47:18.219550493 +0200
5e6360
+++ evolution-data-server-3.12.11/camel/providers/imapx/camel-imapx-server.c	2015-06-01 21:48:23.895134633 +0200
5e6360
@@ -1031,8 +1031,7 @@ static void
5e6360
 imapx_unregister_job (CamelIMAPXServer *is,
5e6360
                       CamelIMAPXJob *job)
5e6360
 {
5e6360
-	if (!job->noreply)
5e6360
-		camel_imapx_job_done (job);
5e6360
+	camel_imapx_job_done (job);
5e6360
 
5e6360
 	QUEUE_LOCK (is);
5e6360
 
5e6360
@@ -1051,10 +1050,17 @@ imapx_submit_job (CamelIMAPXServer *is,
5e6360
                   CamelIMAPXJob *job,
5e6360
                   GError **error)
5e6360
 {
5e6360
+	gboolean success;
5e6360
+
5e6360
 	if (!imapx_register_job (is, job, error))
5e6360
 		return FALSE;
5e6360
 
5e6360
-	return camel_imapx_job_run (job, is, error);
5e6360
+	success = camel_imapx_job_run (job, is, error);
5e6360
+
5e6360
+	if (!success)
5e6360
+		imapx_unregister_job (is, job);
5e6360
+
5e6360
+	return success;
5e6360
 }
5e6360
 
5e6360
 static CamelFolder *
5e6360
@@ -7699,6 +7705,27 @@ imapx_abort_all_commands (CamelIMAPXServ
5e6360
 	}
5e6360
 
5e6360
 	camel_imapx_command_queue_free (queue);
5e6360
+
5e6360
+	QUEUE_LOCK (is);
5e6360
+
5e6360
+	/* Abort also any pending jobs which are not in the command queues yet */
5e6360
+	if (!g_queue_is_empty (&is->jobs)) {
5e6360
+		GList *jobs, *iter;
5e6360
+
5e6360
+		jobs = g_list_copy (g_queue_peek_head_link (&is->jobs));
5e6360
+		g_list_foreach (jobs, (GFunc) camel_imapx_job_ref, NULL);
5e6360
+
5e6360
+		for (iter = jobs; iter != NULL; iter = g_list_next (iter)) {
5e6360
+			CamelIMAPXJob *job = iter->data;
5e6360
+
5e6360
+			camel_imapx_job_take_error (job, g_error_copy (error));
5e6360
+			camel_imapx_job_done (job);
5e6360
+		}
5e6360
+
5e6360
+		g_list_free_full (jobs, (GDestroyNotify) camel_imapx_job_unref);
5e6360
+	}
5e6360
+
5e6360
+	QUEUE_UNLOCK (is);
5e6360
 }
5e6360
 
5e6360
 /* ********************************************************************** */
5e6360
@@ -8461,6 +8488,8 @@ imapx_server_get_message (CamelIMAPXServ
5e6360
 
5e6360
 	if (registered && camel_imapx_job_run (job, is, error))
5e6360
 		stream = camel_stream_new (data->stream);
5e6360
+	else if (registered)
5e6360
+		imapx_unregister_job (is, job);
5e6360
 
5e6360
 	camel_imapx_job_unref (job);
5e6360
 
5e6360
@@ -8820,16 +8849,15 @@ camel_imapx_server_refresh_info (CamelIM
5e6360
 	QUEUE_UNLOCK (is);
5e6360
 
5e6360
 	if (registered)
5e6360
-		camel_imapx_mailbox_lock_update (mailbox);
5e6360
+		camel_imapx_job_guard_mailbox_update (job, mailbox);
5e6360
 
5e6360
 	if (registered && camel_imapx_job_run (job, is, error)) {
5e6360
 		changes = data->changes;
5e6360
 		data->changes = NULL;
5e6360
+	} else if (registered) {
5e6360
+		imapx_unregister_job (is, job);
5e6360
 	}
5e6360
 
5e6360
-	if (registered)
5e6360
-		camel_imapx_mailbox_unlock_update (mailbox);
5e6360
-
5e6360
 	camel_imapx_job_unref (job);
5e6360
 
5e6360
 	return changes;
5e6360
@@ -9158,12 +9186,12 @@ imapx_server_sync_changes (CamelIMAPXSer
5e6360
 	QUEUE_UNLOCK (is);
5e6360
 
5e6360
 	if (job_type == IMAPX_JOB_SYNC_CHANGES && registered)
5e6360
-		camel_imapx_mailbox_lock_update (mailbox);
5e6360
+		camel_imapx_job_guard_mailbox_update (job, mailbox);
5e6360
 
5e6360
 	success = registered && camel_imapx_job_run (job, is, error);
5e6360
 
5e6360
-	if (job_type == IMAPX_JOB_SYNC_CHANGES && registered)
5e6360
-		camel_imapx_mailbox_unlock_update (mailbox);
5e6360
+	if (!success && registered)
5e6360
+		imapx_unregister_job (is, job);
5e6360
 
5e6360
 	camel_imapx_job_unref (job);
5e6360
 
5e6360
@@ -9226,6 +9254,9 @@ camel_imapx_server_expunge (CamelIMAPXSe
5e6360
 
5e6360
 	success = registered && camel_imapx_job_run (job, is, error);
5e6360
 
5e6360
+	if (!success && registered)
5e6360
+		imapx_unregister_job (is, job);
5e6360
+
5e6360
 	camel_imapx_job_unref (job);
5e6360
 
5e6360
 	return success;