diff options
author | Milan Crha <mcrha@redhat.com> | 2012-06-11 22:05:26 +0200 |
---|---|---|
committer | Milan Crha <mcrha@redhat.com> | 2012-06-11 22:05:26 +0200 |
commit | b2dde29dcfae77e7f2a283cae1eb157afdf763e6 (patch) | |
tree | afc9f6facf9887acefed50ca47c0f7e04542ab1f | |
parent | 0d1aa9243998c9cb40b9f47a89fc8e61f85917fd (diff) | |
download | evolution-data-server-b2dde29dcfae77e7f2a283cae1eb157afdf763e6.tar.gz |
Backport IMAPx changes for bug #664639 from master
-rw-r--r-- | camel/providers/imapx/camel-imapx-conn-manager.c | 22 | ||||
-rw-r--r-- | camel/providers/imapx/camel-imapx-server.c | 4 |
2 files changed, 21 insertions, 5 deletions
diff --git a/camel/providers/imapx/camel-imapx-conn-manager.c b/camel/providers/imapx/camel-imapx-conn-manager.c index 1b87384cf..89d1af53a 100644 --- a/camel/providers/imapx/camel-imapx-conn-manager.c +++ b/camel/providers/imapx/camel-imapx-conn-manager.c @@ -67,6 +67,13 @@ G_DEFINE_TYPE ( camel_imapx_conn_manager, CAMEL_TYPE_OBJECT) +static void +imapx_conn_shutdown (CamelIMAPXServer *is, CamelIMAPXConnManager *con_man); + +static void +imapx_conn_update_select (CamelIMAPXServer *is, const gchar *selected_folder, + CamelIMAPXConnManager *con_man); + static ConnectionInfo * connection_info_new (CamelIMAPXServer *is) { @@ -107,7 +114,6 @@ connection_info_unref (ConnectionInfo *cinfo) if (g_atomic_int_dec_and_test (&cinfo->ref_count)) { camel_imapx_server_connect (cinfo->is, NULL, NULL); - g_mutex_free (cinfo->lock); g_object_unref (cinfo->is); g_hash_table_destroy (cinfo->folder_names); @@ -117,6 +123,18 @@ connection_info_unref (ConnectionInfo *cinfo) } } +static void +connection_info_cancel_and_unref (ConnectionInfo *cinfo) +{ + g_return_if_fail (cinfo != NULL); + g_return_if_fail (cinfo->ref_count > 0); + + g_signal_handlers_disconnect_matched (cinfo->is, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, imapx_conn_shutdown, NULL); + g_signal_handlers_disconnect_matched (cinfo->is, G_SIGNAL_MATCH_FUNC, 0, 0, NULL, imapx_conn_update_select, NULL); + g_cancellable_cancel (cinfo->is->cancellable); + connection_info_unref (cinfo); +} + static gboolean connection_info_is_available (ConnectionInfo *cinfo) { @@ -721,7 +739,7 @@ camel_imapx_conn_manager_close_connections (CamelIMAPXConnManager *con_man) g_list_free_full ( con_man->priv->connections, - (GDestroyNotify) connection_info_unref); + (GDestroyNotify) connection_info_cancel_and_unref); con_man->priv->connections = NULL; CON_WRITE_UNLOCK (con_man); diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c index f4819efeb..f5d08d9ef 100644 --- a/camel/providers/imapx/camel-imapx-server.c +++ b/camel/providers/imapx/camel-imapx-server.c @@ -5360,8 +5360,7 @@ imapx_parser_thread (gpointer d) if (is->parser_quit) g_cancellable_cancel (cancellable); - - if (g_cancellable_is_cancelled (cancellable)) { + else if (g_cancellable_is_cancelled (cancellable)) { gint is_empty; QUEUE_LOCK (is); @@ -5399,7 +5398,6 @@ imapx_parser_thread (gpointer d) QUEUE_UNLOCK (is); is->parser_quit = FALSE; - g_signal_emit (is, signals[SHUTDOWN], 0); return NULL; |