[evolution-data-server/gnome-3-36] I#211 - IMAPx: No IDLE after extraneous connection reset
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/gnome-3-36] I#211 - IMAPx: No IDLE after extraneous connection reset
- Date: Wed, 6 May 2020 11:50:44 +0000 (UTC)
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]