|
|
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;
|