[evolution-data-server/evolution-data-server-3-12] camel_imapx_conn_manager_get_connection: Ensure only connected servers are returned



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]