Mercurial > dovecot > core-2.2
changeset 14406:c760ac046203
director: List of director connections belongs to struct director.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 02 Apr 2012 23:39:48 +0300 |
parents | 168e3b5cb6e8 |
children | d6cd93e32b37 |
files | src/director/director-connection.c src/director/director-connection.h src/director/director.c src/director/director.h |
diffstat | 4 files changed, 39 insertions(+), 35 deletions(-) [+] |
line wrap: on
line diff
--- 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); - } -}
--- 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
--- 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); }
--- 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;