dovecot-2.1: director: List of director connections belongs to s...

dovecot at dovecot.org dovecot at dovecot.org
Tue Apr 3 00:09:09 EEST 2012


details:   http://hg.dovecot.org/dovecot-2.1/rev/c760ac046203
changeset: 14370:c760ac046203
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Apr 02 23:39:48 2012 +0300
description:
director: List of director connections belongs to struct director.

diffstat:

 src/director/director-connection.c |  40 ++++++++++++-------------------------
 src/director/director-connection.h |   6 +----
 src/director/director.c            |  26 ++++++++++++++++++++++-
 src/director/director.h            |   2 +-
 4 files changed, 39 insertions(+), 35 deletions(-)

diffs (185 lines):

diff -r 168e3b5cb6e8 -r c760ac046203 src/director/director-connection.c
--- a/src/director/director-connection.c	Mon Apr 02 23:28:22 2012 +0300
+++ b/src/director/director-connection.c	Mon Apr 02 23:39:48 2012 +0300
@@ -7,7 +7,6 @@
 #include "istream.h"
 #include "ostream.h"
 #include "str.h"
-#include "llist.h"
 #include "master-service.h"
 #include "mail-host.h"
 #include "director.h"
@@ -35,8 +34,6 @@
 #define DIRECTOR_SUCCESS_MIN_CONNECT_SECS 10
 
 struct director_connection {
-	struct director_connection *prev, *next;
-
 	struct director *dir;
 	char *name;
 	time_t created;
@@ -1116,7 +1113,7 @@
 				    director_connection_output, conn);
 	conn->to_ping = timeout_add(DIRECTOR_CONNECTION_INIT_TIMEOUT_MSECS,
 				    director_connection_init_timeout, conn);
-	DLLIST_PREPEND(&dir->connections, conn);
+	array_append(&dir->connections, &conn, 1);
 	return conn;
 }
 
@@ -1212,8 +1209,9 @@
 
 void director_connection_deinit(struct director_connection **_conn)
 {
-	struct director_connection *conn = *_conn;
+	struct director_connection *const *conns, *conn = *_conn;
 	struct director *dir = conn->dir;
+	unsigned int i, count;
 
 	*_conn = NULL;
 
@@ -1224,7 +1222,14 @@
 	    conn->created + DIRECTOR_SUCCESS_MIN_CONNECT_SECS > ioloop_time)
 		conn->host->last_failed = ioloop_time;
 
-	DLLIST_REMOVE(&dir->connections, conn);
+	conns = array_get(&dir->connections, &count);
+	for (i = 0; i < count; i++) {
+		if (conns[i] == conn) {
+			array_delete(&dir->connections, i, 1);
+			break;
+		}
+	}
+	i_assert(i < count);
 	if (dir->left == conn)
 		dir->left = NULL;
 	if (dir->right == conn)
@@ -1328,17 +1333,9 @@
 	return conn->host;
 }
 
-struct director_connection *
-director_connection_find_outgoing(struct director *dir,
-				  struct director_host *host)
+bool director_connection_is_incoming(struct director_connection *conn)
 {
-	struct director_connection *conn;
-
-	for (conn = dir->connections; conn != NULL; conn = conn->next) {
-		if (conn->host == host && !conn->in)
-			return conn;
-	}
-	return NULL;
+	return conn->in;
 }
 
 void director_connection_cork(struct director_connection *conn)
@@ -1364,14 +1361,3 @@
 
 	director_connection_set_ping_timeout(conn);
 }
-
-void director_connections_deinit(struct director *dir)
-{
-	struct director_connection *conn;
-
-	while (dir->connections != NULL) {
-		conn = dir->connections;
-		dir->connections = conn->next;
-		director_connection_deinit(&conn);
-	}
-}
diff -r 168e3b5cb6e8 -r c760ac046203 src/director/director-connection.h
--- a/src/director/director-connection.h	Mon Apr 02 23:28:22 2012 +0300
+++ b/src/director/director-connection.h	Mon Apr 02 23:39:48 2012 +0300
@@ -23,13 +23,9 @@
 const char *director_connection_get_name(struct director_connection *conn);
 struct director_host *
 director_connection_get_host(struct director_connection *conn);
-struct director_connection *
-director_connection_find_outgoing(struct director *dir,
-				  struct director_host *host);
+bool director_connection_is_incoming(struct director_connection *conn);
 
 void director_connection_cork(struct director_connection *conn);
 void director_connection_uncork(struct director_connection *conn);
 
-void director_connections_deinit(struct director *dir);
-
 #endif
diff -r 168e3b5cb6e8 -r c760ac046203 src/director/director.c
--- a/src/director/director.c	Mon Apr 02 23:28:22 2012 +0300
+++ b/src/director/director.c	Mon Apr 02 23:39:48 2012 +0300
@@ -81,12 +81,26 @@
 	i_unreached();
 }
 
+static bool
+director_has_outgoing_connection(struct director *dir,
+				 struct director_host *host)
+{
+	struct director_connection *const *connp;
+
+	array_foreach(&dir->connections, connp) {
+		if (director_connection_get_host(*connp) == host &&
+		    !director_connection_is_incoming(*connp))
+			return TRUE;
+	}
+	return FALSE;
+}
+
 int director_connect_host(struct director *dir, struct director_host *host)
 {
 	unsigned int port;
 	int fd;
 
-	if (director_connection_find_outgoing(dir, host) != NULL)
+	if (director_has_outgoing_connection(dir, host))
 		return 0;
 
 	if (dir->debug) {
@@ -669,6 +683,7 @@
 	dir->state_change_callback = callback;
 	i_array_init(&dir->dir_hosts, 16);
 	i_array_init(&dir->pending_requests, 16);
+	i_array_init(&dir->connections, 8);
 	dir->users = user_directory_init(set->director_user_expire,
 					 set->director_username_hash);
 	dir->mail_hosts = mail_hosts_init();
@@ -682,10 +697,16 @@
 {
 	struct director *dir = *_dir;
 	struct director_host *const *hostp;
+	struct director_connection *conn, *const *connp;
 
 	*_dir = NULL;
 
-	director_connections_deinit(dir);
+	while (array_count(&dir->connections) > 0) {
+		connp = array_idx(&dir->connections, 0);
+		conn = *connp;
+		director_connection_deinit(&conn);
+	}
+
 	user_directory_deinit(&dir->users);
 	mail_hosts_deinit(&dir->mail_hosts);
 	mail_hosts_deinit(&dir->orig_config_hosts);
@@ -703,5 +724,6 @@
 		director_host_free(*hostp);
 	array_free(&dir->pending_requests);
 	array_free(&dir->dir_hosts);
+	array_free(&dir->connections);
 	i_free(dir);
 }
diff -r 168e3b5cb6e8 -r c760ac046203 src/director/director.h
--- a/src/director/director.h	Mon Apr 02 23:28:22 2012 +0300
+++ b/src/director/director.h	Mon Apr 02 23:39:48 2012 +0300
@@ -29,7 +29,7 @@
 	struct director_host *self_host;
 	struct director_connection *left, *right;
 	/* all director connections */
-	struct director_connection *connections;
+	ARRAY_DEFINE(connections, struct director_connection *);
 	struct timeout *to_reconnect;
 	struct timeout *to_sync;
 


More information about the dovecot-cvs mailing list