Mercurial > dovecot > original-hg > dovecot-2.1
changeset 13911:fd8fc3b7615e
auth: Use linked list instead of array for storing list of auth connections.
With arrays the removal was slower than necessary.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 09 Jan 2012 16:29:37 +0200 |
parents | 5173218ff7fe |
children | f562bcaca215 |
files | src/auth/auth-client-connection.c src/auth/auth-client-connection.h src/auth/auth-master-connection.c src/auth/auth-master-connection.h src/auth/main.c |
diffstat | 5 files changed, 32 insertions(+), 67 deletions(-) [+] |
line wrap: on
line diff
--- a/src/auth/auth-client-connection.c Sat Jan 07 20:28:42 2012 +0200 +++ b/src/auth/auth-client-connection.c Mon Jan 09 16:29:37 2012 +0200 @@ -1,13 +1,13 @@ /* Copyright (c) 2002-2011 Dovecot authors, see the included COPYING file */ #include "auth-common.h" -#include "array.h" #include "ioloop.h" #include "istream.h" #include "ostream.h" #include "network.h" #include "hex-binary.h" #include "hostpid.h" +#include "llist.h" #include "str.h" #include "str-sanitize.h" #include "randgen.h" @@ -24,12 +24,12 @@ #define OUTBUF_THROTTLE_SIZE (1024*50) -static ARRAY_DEFINE(auth_client_connections, struct auth_client_connection *); - static void auth_client_disconnected(struct auth_client_connection **_conn); static void auth_client_connection_unref(struct auth_client_connection **_conn); static void auth_client_input(struct auth_client_connection *conn); +static struct auth_client_connection *auth_client_connections; + static const char *reply_line_hide_pass(const char *line) { const char *p, *p2; @@ -304,7 +304,7 @@ o_stream_set_flush_callback(conn->output, auth_client_output, conn); conn->io = io_add(fd, IO_READ, auth_client_input, conn); - array_append(&auth_client_connections, &conn, 1); + DLLIST_PREPEND(&auth_client_connections, conn); str = t_str_new(128); str_printfa(str, "VERSION\t%u\t%u\n%sSPID\t%s\nCUID\t%u\nCOOKIE\t", @@ -323,21 +323,12 @@ void auth_client_connection_destroy(struct auth_client_connection **_conn) { struct auth_client_connection *conn = *_conn; - struct auth_client_connection *const *clients; - unsigned int idx; *_conn = NULL; if (conn->fd == -1) return; - array_foreach(&auth_client_connections, clients) { - if (*clients == conn) { - idx = array_foreach_idx(&auth_client_connections, - clients); - array_delete(&auth_client_connections, idx, 1); - break; - } - } + DLLIST_REMOVE(&auth_client_connections, conn); i_stream_close(conn->input); o_stream_close(conn->output); @@ -398,30 +389,21 @@ struct auth_client_connection * auth_client_connection_lookup(unsigned int pid) { - struct auth_client_connection *const *clients; - - array_foreach(&auth_client_connections, clients) { - struct auth_client_connection *client = *clients; + struct auth_client_connection *conn; - if (client->pid == pid) - return client; + for (conn = auth_client_connections; conn != NULL; conn = conn->next) { + if (conn->pid == pid) + return conn; } - return NULL; } -void auth_client_connections_init(void) -{ - i_array_init(&auth_client_connections, 16); -} - -void auth_client_connections_deinit(void) +void auth_client_connections_destroy_all(void) { - struct auth_client_connection **clients; - unsigned int i, count; + struct auth_client_connection *conn; - clients = array_get_modifiable(&auth_client_connections, &count); - for (i = count; i > 0; i--) - auth_client_connection_destroy(&clients[i-1]); - array_free(&auth_client_connections); + while (auth_client_connections != NULL) { + conn = auth_client_connections; + auth_client_connection_destroy(&conn); + } }
--- a/src/auth/auth-client-connection.h Sat Jan 07 20:28:42 2012 +0200 +++ b/src/auth/auth-client-connection.h Mon Jan 09 16:29:37 2012 +0200 @@ -4,6 +4,7 @@ #include "master-auth.h" struct auth_client_connection { + struct auth_client_connection *prev, *next; struct auth *auth; int refcount; @@ -28,7 +29,6 @@ struct auth_client_connection * auth_client_connection_lookup(unsigned int pid); -void auth_client_connections_init(void); -void auth_client_connections_deinit(void); +void auth_client_connections_destroy_all(void); #endif
--- a/src/auth/auth-master-connection.c Sat Jan 07 20:28:42 2012 +0200 +++ b/src/auth/auth-master-connection.c Mon Jan 09 16:29:37 2012 +0200 @@ -1,8 +1,9 @@ /* Copyright (c) 2002-2011 Dovecot authors, see the included COPYING file */ #include "auth-common.h" -#include "array.h" +#include "buffer.h" #include "hash.h" +#include "llist.h" #include "str.h" #include "strescape.h" #include "str-sanitize.h" @@ -41,7 +42,7 @@ static void master_input(struct auth_master_connection *conn); -ARRAY_TYPE(auth_master_connections) auth_master_connections; +static struct auth_master_connection *auth_master_connections; static const char * auth_master_reply_hide_passwords(struct auth_master_connection *conn, @@ -678,7 +679,7 @@ AUTH_MASTER_PROTOCOL_MINOR_VERSION, my_pid); (void)o_stream_send_str(conn->output, line); - array_append(&auth_master_connections, &conn, 1); + DLLIST_PREPEND(&auth_master_connections, conn); if (auth_master_connection_set_permissions(conn, socket_st) < 0) { auth_master_connection_destroy(&conn); @@ -690,22 +691,13 @@ void auth_master_connection_destroy(struct auth_master_connection **_conn) { struct auth_master_connection *conn = *_conn; - struct auth_master_connection *const *masters; - unsigned int idx; *_conn = NULL; if (conn->destroyed) return; conn->destroyed = TRUE; - array_foreach(&auth_master_connections, masters) { - if (*masters == conn) { - idx = array_foreach_idx(&auth_master_connections, - masters); - array_delete(&auth_master_connections, idx, 1); - break; - } - } + DLLIST_REMOVE(&auth_master_connections, conn); if (conn->input != NULL) i_stream_close(conn->input); @@ -749,18 +741,12 @@ i_free(conn); } -void auth_master_connections_init(void) -{ - i_array_init(&auth_master_connections, 16); -} - -void auth_master_connections_deinit(void) +void auth_master_connections_destroy_all(void) { - struct auth_master_connection **masters; - unsigned int i, count; + struct auth_master_connection *conn; - masters = array_get_modifiable(&auth_master_connections, &count); - for (i = count; i > 0; i--) - auth_master_connection_destroy(&masters[i-1]); - array_free(&auth_master_connections); + while (auth_master_connections != NULL) { + conn = auth_master_connections; + auth_master_connection_destroy(&conn); + } }
--- a/src/auth/auth-master-connection.h Sat Jan 07 20:28:42 2012 +0200 +++ b/src/auth/auth-master-connection.h Mon Jan 09 16:29:37 2012 +0200 @@ -5,6 +5,7 @@ struct auth_stream_reply; struct auth_master_connection { + struct auth_master_connection *prev, *next; struct auth *auth; int refcount; @@ -23,9 +24,6 @@ unsigned int destroyed:1; unsigned int userdb_only:1; }; -ARRAY_DEFINE_TYPE(auth_master_connections, struct auth_master_connection *); - -extern ARRAY_TYPE(auth_master_connections) auth_master_connections; struct auth_master_connection * auth_master_connection_create(struct auth *auth, int fd, @@ -39,7 +37,6 @@ void auth_master_request_callback(struct auth_stream_reply *reply, void *context); -void auth_master_connections_init(void); -void auth_master_connections_deinit(void); +void auth_master_connections_destroy_all(void); #endif
--- a/src/auth/main.c Sat Jan 07 20:28:42 2012 +0200 +++ b/src/auth/main.c Mon Jan 09 16:29:37 2012 +0200 @@ -261,8 +261,8 @@ /* there are no more auth requests */ auths_free(); - auth_client_connections_deinit(); - auth_master_connections_deinit(); + auth_client_connections_destroy_all(); + auth_master_connections_destroy_all(); if (auth_worker_client != NULL) auth_worker_client_destroy(&auth_worker_client);