[evolution-data-server/gnome-3-36] I#211 - IMAPx: No IDLE after extraneous connection reset



commit 535691ef08044e5d72683ca3c706de670113ace3
Author: Milan Crha <mcrha redhat com>
Date:   Wed May 6 13:50:20 2020 +0200

    I#211 - IMAPx: No IDLE after extraneous connection reset
    
    Closes https://gitlab.gnome.org/GNOME/evolution-data-server/-/issues/211

 src/camel/providers/imapx/camel-imapx-conn-manager.c | 15 ++++++---------
 src/camel/providers/imapx/camel-imapx-server.c       |  7 ++++++-
 2 files changed, 12 insertions(+), 10 deletions(-)
---
diff --git a/src/camel/providers/imapx/camel-imapx-conn-manager.c 
b/src/camel/providers/imapx/camel-imapx-conn-manager.c
index 1d8a48433..74b025fb3 100644
--- a/src/camel/providers/imapx/camel-imapx-conn-manager.c
+++ b/src/camel/providers/imapx/camel-imapx-conn-manager.c
@@ -1195,20 +1195,19 @@ camel_imapx_conn_manager_run_job_sync (CamelIMAPXConnManager *conn_man,
                cinfo = camel_imapx_conn_manager_ref_connection (conn_man, camel_imapx_job_get_mailbox (job), 
&is_new_connection, cancellable, error);
                if (cinfo) {
                        CamelIMAPXMailbox *job_mailbox;
+                       CamelIMAPXMailbox *idle_mailbox;
 
                        job_mailbox = camel_imapx_job_get_mailbox (job);
 
                        if (job_mailbox)
                                imapx_conn_manager_inc_mailbox_busy (conn_man, job_mailbox);
 
-                       if (camel_imapx_server_is_in_idle (cinfo->is)) {
-                               CamelIMAPXMailbox *idle_mailbox;
+                       idle_mailbox = camel_imapx_server_ref_idle_mailbox (cinfo->is);
 
-                               idle_mailbox = camel_imapx_server_ref_idle_mailbox (cinfo->is);
-                               if (idle_mailbox)
-                                       imapx_conn_manager_dec_mailbox_idle (conn_man, idle_mailbox);
-                               g_clear_object (&idle_mailbox);
-                       }
+                       if (idle_mailbox)
+                               imapx_conn_manager_dec_mailbox_idle (conn_man, idle_mailbox);
+
+                       g_clear_object (&idle_mailbox);
 
                        success = camel_imapx_server_stop_idle_sync (cinfo->is, cancellable, &local_error);
 
@@ -1267,8 +1266,6 @@ camel_imapx_conn_manager_run_job_sync (CamelIMAPXConnManager *conn_man,
                                imapx_conn_manager_dec_mailbox_busy (conn_man, job_mailbox);
 
                        if (success) {
-                               CamelIMAPXMailbox *idle_mailbox = NULL;
-
                                if (!imapx_conn_manager_has_inbox_idle (conn_man)) {
                                        CamelIMAPXStore *imapx_store;
 
diff --git a/src/camel/providers/imapx/camel-imapx-server.c b/src/camel/providers/imapx/camel-imapx-server.c
index 3883321ec..816c6e66e 100644
--- a/src/camel/providers/imapx/camel-imapx-server.c
+++ b/src/camel/providers/imapx/camel-imapx-server.c
@@ -7122,6 +7122,8 @@ camel_imapx_server_ref_idle_mailbox (CamelIMAPXServer *is)
                        mailbox = g_object_ref (is->priv->idle_mailbox);
                else
                        mailbox = camel_imapx_server_ref_selected (is);
+       } else if (is->priv->idle_mailbox) {
+               mailbox = g_object_ref (is->priv->idle_mailbox);
        }
 
        g_mutex_unlock (&is->priv->idle_lock);
@@ -7208,6 +7210,10 @@ camel_imapx_server_stop_idle_sync (CamelIMAPXServer *is,
 
        g_mutex_lock (&is->priv->idle_lock);
 
+       /* Always clear it, in case the IDLE thread disconnected due to network error,
+          in which case the state is OFF, but the idle_mailbox can be still set. */
+       g_clear_object (&is->priv->idle_mailbox);
+
        if (is->priv->idle_state == IMAPX_IDLE_STATE_OFF) {
                g_mutex_unlock (&is->priv->idle_lock);
                return TRUE;
@@ -7225,7 +7231,6 @@ camel_imapx_server_stop_idle_sync (CamelIMAPXServer *is,
        idle_cancellable = is->priv->idle_cancellable ? g_object_ref (is->priv->idle_cancellable) : NULL;
 
        g_clear_object (&is->priv->idle_cancellable);
-       g_clear_object (&is->priv->idle_mailbox);
        is->priv->idle_stamp++;
 
        if (cancellable) {


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