[evolution-data-server] [IMAPx] Do not inherit cancelled errors from previously running jobs



commit 662b78df34f70e5de81aa309d0d5e767b29d4540
Author: Milan Crha <mcrha redhat com>
Date:   Fri Aug 21 16:26:17 2015 +0200

    [IMAPx] Do not inherit cancelled errors from previously running jobs
    
    When there are two same jobs running, then the later is waiting for
    the result of the former and inherits it. It doesn't make sense to
    inherit also the cancellation of the previous job, better to try again.

 camel/providers/imapx/camel-imapx-conn-manager.c |    4 +++-
 camel/providers/imapx/camel-imapx-job.c          |   11 +++++++++++
 camel/providers/imapx/camel-imapx-job.h          |    1 +
 3 files changed, 15 insertions(+), 1 deletions(-)
---
diff --git a/camel/providers/imapx/camel-imapx-conn-manager.c 
b/camel/providers/imapx/camel-imapx-conn-manager.c
index e3cda41..9d612fb 100644
--- a/camel/providers/imapx/camel-imapx-conn-manager.c
+++ b/camel/providers/imapx/camel-imapx-conn-manager.c
@@ -947,7 +947,9 @@ camel_imapx_conn_manager_run_job_sync (CamelIMAPXConnManager *conn_man,
                                gpointer result = NULL;
                                GDestroyNotify destroy_result = NULL;
 
-                               if (camel_imapx_job_copy_result (queued_job, &success, &result, &local_error, 
&destroy_result)) {
+                               /* Do not inherit cancelled errors, just try again */
+                               if (!camel_imapx_job_was_cancelled (queued_job) &&
+                                   camel_imapx_job_copy_result (queued_job, &success, &result, &local_error, 
&destroy_result)) {
                                        camel_imapx_job_set_result (job, success, result, local_error, 
destroy_result);
                                        camel_imapx_job_unref (queued_job);
 
diff --git a/camel/providers/imapx/camel-imapx-job.c b/camel/providers/imapx/camel-imapx-job.c
index 1912063..7f944cd 100644
--- a/camel/providers/imapx/camel-imapx-job.c
+++ b/camel/providers/imapx/camel-imapx-job.c
@@ -273,6 +273,17 @@ camel_imapx_job_set_user_data (CamelIMAPXJob *job,
        job->destroy_user_data = destroy_user_data;
 }
 
+gboolean
+camel_imapx_job_was_cancelled (CamelIMAPXJob *job)
+{
+       g_return_val_if_fail (job != NULL, FALSE);
+
+       if (!job->result_is_set)
+               return FALSE;
+
+       return g_error_matches (job->result_error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
+}
+
 void
 camel_imapx_job_set_result (CamelIMAPXJob *job,
                            gboolean success,
diff --git a/camel/providers/imapx/camel-imapx-job.h b/camel/providers/imapx/camel-imapx-job.h
index ccad91b..de0c5d1 100644
--- a/camel/providers/imapx/camel-imapx-job.h
+++ b/camel/providers/imapx/camel-imapx-job.h
@@ -93,6 +93,7 @@ gpointer      camel_imapx_job_get_user_data   (CamelIMAPXJob *job);
 void           camel_imapx_job_set_user_data   (CamelIMAPXJob *job,
                                                 gpointer user_data,
                                                 GDestroyNotify destroy_user_data);
+gboolean       camel_imapx_job_was_cancelled   (CamelIMAPXJob *job);
 void           camel_imapx_job_set_result      (CamelIMAPXJob *job,
                                                 gboolean success,
                                                 gpointer result,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]