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