[evolution-data-server/evolution-data-server-3-12] camel_imapx_conn_manager_get_connection: Ensure only connected servers are returned
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server/evolution-data-server-3-12] camel_imapx_conn_manager_get_connection: Ensure only connected servers are returned
- Date: Fri, 9 May 2014 10:08:25 +0000 (UTC)
commit f4c2d8c13b1567bf641af19d7bd235c9d7fadae9
Author: Milan Crha <mcrha redhat com>
Date: Fri May 9 12:03:35 2014 +0200
camel_imapx_conn_manager_get_connection: Ensure only connected servers are returned
It could happen, still, that the CamelIMAPXServer is disconnected or shutdown
in the list of connections and it is being returned, which is not
correct, thus better never return such dead connections. Once
the server's state is set to shutdown it is automatically removed
from the list, but here plays a role thread interleaving or something,
which does the remove slightly later than expected.
camel/providers/imapx/camel-imapx-conn-manager.c | 15 +++++++++++----
camel/providers/imapx/camel-imapx-server.c | 8 ++++++++
camel/providers/imapx/camel-imapx-server.h | 1 +
3 files changed, 20 insertions(+), 4 deletions(-)
---
diff --git a/camel/providers/imapx/camel-imapx-conn-manager.c
b/camel/providers/imapx/camel-imapx-conn-manager.c
index 29fdbcb..92a8a5f 100644
--- a/camel/providers/imapx/camel-imapx-conn-manager.c
+++ b/camel/providers/imapx/camel-imapx-conn-manager.c
@@ -561,7 +561,7 @@ imapx_find_connection_unlocked (CamelIMAPXConnManager *con_man,
if (camel_imapx_server_has_expensive_command (candidate->is))
expensive_connections++;
- if (connection_info_has_folder_name (candidate, folder_name) &&
+ if (connection_info_has_folder_name (candidate, folder_name) &&
camel_imapx_server_is_connected (candidate->is) &&
(opened_connections >= concurrent_connections || for_expensive_job ||
!camel_imapx_server_has_expensive_command (candidate->is))) {
if (cinfo) {
/* group expensive jobs into one connection */
@@ -599,7 +599,8 @@ imapx_find_connection_unlocked (CamelIMAPXConnManager *con_man,
ConnectionInfo *candidate = link->data;
guint jobs;
- if (!camel_imapx_server_has_expensive_command (candidate->is))
+ if (!camel_imapx_server_is_connected (candidate->is) ||
+ !camel_imapx_server_has_expensive_command (candidate->is))
continue;
jobs = camel_imapx_server_get_command_count (candidate->is);
@@ -623,7 +624,8 @@ imapx_find_connection_unlocked (CamelIMAPXConnManager *con_man,
for (link = list; link != NULL; link = g_list_next (link)) {
ConnectionInfo *candidate = link->data;
- if (connection_info_is_available (candidate)) {
+ if (camel_imapx_server_is_connected (candidate->is) &&
+ connection_info_is_available (candidate)) {
if (cinfo)
connection_info_unref (cinfo);
cinfo = connection_info_ref (candidate);
@@ -646,7 +648,12 @@ imapx_find_connection_unlocked (CamelIMAPXConnManager *con_man,
/* Pick the connection with the least number of jobs in progress. */
for (link = list; link != NULL; link = g_list_next (link)) {
ConnectionInfo *candidate = link->data;
- gint n_commands = camel_imapx_server_get_command_count (candidate->is);
+ gint n_commands;
+
+ if (!camel_imapx_server_is_connected (candidate->is))
+ continue;
+
+ n_commands = camel_imapx_server_get_command_count (candidate->is);
if (cinfo == NULL) {
cinfo = connection_info_ref (candidate);
diff --git a/camel/providers/imapx/camel-imapx-server.c b/camel/providers/imapx/camel-imapx-server.c
index 7302367..97e6454 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -4640,6 +4640,14 @@ exit:
return success;
}
+gboolean
+camel_imapx_server_is_connected (CamelIMAPXServer *imapx_server)
+{
+ g_return_val_if_fail (CAMEL_IS_IMAPX_SERVER (imapx_server), FALSE);
+
+ return imapx_server->state >= IMAPX_CONNECTED;
+}
+
CamelAuthenticationResult
camel_imapx_server_authenticate (CamelIMAPXServer *is,
const gchar *mechanism,
diff --git a/camel/providers/imapx/camel-imapx-server.h b/camel/providers/imapx/camel-imapx-server.h
index 1e824bd..54d8220 100644
--- a/camel/providers/imapx/camel-imapx-server.h
+++ b/camel/providers/imapx/camel-imapx-server.h
@@ -159,6 +159,7 @@ gboolean camel_imapx_server_connect (CamelIMAPXServer *is,
gboolean imapx_connect_to_server (CamelIMAPXServer *is,
GCancellable *cancellable,
GError **error);
+gboolean camel_imapx_server_is_connected (CamelIMAPXServer *imapx_server);
CamelAuthenticationResult
camel_imapx_server_authenticate (CamelIMAPXServer *is,
const gchar *mechanism,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]