[evolution-data-server] 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] camel_imapx_conn_manager_get_connection: Ensure only connected servers are returned
- Date: Fri, 9 May 2014 10:07:12 +0000 (UTC)
commit 930e62aeeb2ab3368da83219b10d1a79c03eba1b
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 2b7b8db..11bb61f 100644
--- a/camel/providers/imapx/camel-imapx-server.c
+++ b/camel/providers/imapx/camel-imapx-server.c
@@ -4641,6 +4641,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 4c44db6..687b7e0 100644
--- a/camel/providers/imapx/camel-imapx-server.h
+++ b/camel/providers/imapx/camel-imapx-server.h
@@ -160,6 +160,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]