Mercurial > dovecot > original-hg > dovecot-1.2
changeset 7079:d45c3058b91a HEAD
Renamed queue to aqueue ("array queue") because struct queue already exists
in Solaris.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 01 Jan 2008 18:48:09 +0200 |
parents | 4e3c7037c2ca |
children | 19bd363bcf5d |
files | src/auth/db-ldap.c src/auth/db-ldap.h src/lib/Makefile.am src/lib/aqueue.c src/lib/aqueue.h src/lib/queue.c src/lib/queue.h src/tests/test-lib.c |
diffstat | 8 files changed, 215 insertions(+), 213 deletions(-) [+] |
line wrap: on
line diff
--- a/src/auth/db-ldap.c Sun Dec 30 17:08:29 2007 +0200 +++ b/src/auth/db-ldap.c Tue Jan 01 18:48:09 2008 +0200 @@ -8,7 +8,7 @@ #include "ioloop.h" #include "array.h" #include "hash.h" -#include "queue.h" +#include "aqueue.h" #include "str.h" #include "var-expand.h" #include "settings.h" @@ -273,7 +273,7 @@ static bool db_ldap_request_queue_next(struct ldap_connection *conn) { struct ldap_request *const *requestp, *request; - unsigned int queue_size = queue_count(conn->request_queue); + unsigned int queue_size = aqueue_count(conn->request_queue); int ret = -1; if (conn->pending_count == queue_size) { @@ -289,8 +289,8 @@ return FALSE; requestp = array_idx(&conn->request_array, - queue_idx(conn->request_queue, - conn->pending_count)); + aqueue_idx(conn->request_queue, + conn->pending_count)); request = *requestp; if (conn->pending_count > 0 && @@ -336,7 +336,7 @@ return FALSE; } else { /* broken request, remove from queue */ - queue_delete_tail(conn->request_queue); + aqueue_delete_tail(conn->request_queue); request->callback(conn, request, NULL); return TRUE; } @@ -349,7 +349,7 @@ request->create_time = ioloop_time; if (conn->request_queue->full && - queue_count(conn->request_queue) >= DB_LDAP_MAX_QUEUE_SIZE) { + aqueue_count(conn->request_queue) >= DB_LDAP_MAX_QUEUE_SIZE) { /* Queue is full already, fail this request */ auth_request_log_error(request->auth_request, "ldap", "Request queue is full"); @@ -357,7 +357,7 @@ return; } - queue_append(conn->request_queue, &request); + aqueue_append(conn->request_queue, &request); (void)db_ldap_request_queue_next(conn); } @@ -405,9 +405,9 @@ struct ldap_request *const *requestp, *request; time_t diff; - while (queue_count(conn->request_queue) > 0 && max_count > 0) { + while (aqueue_count(conn->request_queue) > 0 && max_count > 0) { requestp = array_idx(&conn->request_array, - queue_idx(conn->request_queue, 0)); + aqueue_idx(conn->request_queue, 0)); request = *requestp; diff = ioloop_time - request->create_time; @@ -415,7 +415,7 @@ break; /* timed out, abort */ - queue_delete_tail(conn->request_queue); + aqueue_delete_tail(conn->request_queue); if (request->msgid != -1) { i_assert(conn->pending_count > 0); @@ -446,10 +446,10 @@ return; } - count = queue_count(conn->request_queue); + count = aqueue_count(conn->request_queue); requests = count == 0 ? NULL : array_idx(&conn->request_array, 0); for (i = 0; i < count; i++) { - request = requests[queue_idx(conn->request_queue, i)]; + request = requests[aqueue_idx(conn->request_queue, i)]; if (request->msgid == msgid) break; if (request->msgid == -1) { @@ -469,7 +469,7 @@ } i_assert(conn->pending_count > 0); conn->pending_count--; - queue_delete(conn->request_queue, i); + aqueue_delete(conn->request_queue, i); ret = ldap_result2error(conn->ld, res, 0); if (ret != LDAP_SUCCESS && request->type == LDAP_REQUEST_TYPE_SEARCH) { @@ -529,7 +529,7 @@ } else if (ldap_get_errno(conn) != LDAP_SERVER_DOWN) { i_error("LDAP: ldap_result() failed: %s", ldap_get_error(conn)); ldap_conn_reconnect(conn); - } else if (queue_count(conn->request_queue) > 0 || + } else if (aqueue_count(conn->request_queue) > 0 || ioloop_time - conn->last_reply_stamp < DB_LDAP_IDLE_RECONNECT_SECS) { i_error("LDAP: Connection lost to LDAP server, reconnecting"); @@ -718,7 +718,7 @@ DB_LDAP_REQUEST_DISCONNECT_TIMEOUT_SECS, FALSE, "LDAP server not connected"); - if (queue_count(conn->request_queue) == 0) { + if (aqueue_count(conn->request_queue) == 0) { /* no requests left, remove this timeout handler */ timeout_remove(&conn->to); } @@ -735,7 +735,7 @@ if (conn->pending_count != 0) { requests = array_idx(&conn->request_array, 0); for (i = 0; i < conn->pending_count; i++) { - request = requests[queue_idx(conn->request_queue, i)]; + request = requests[aqueue_idx(conn->request_queue, i)]; i_assert(request->msgid != -1); request->msgid = -1; @@ -752,7 +752,7 @@ } conn->fd = -1; - if (queue_count(conn->request_queue) == 0) { + if (aqueue_count(conn->request_queue) == 0) { if (conn->to != NULL) timeout_remove(&conn->to); } else if (conn->to == NULL) { @@ -1084,7 +1084,7 @@ conn->set.ldap_scope = scope2str(conn->set.scope); i_array_init(&conn->request_array, DB_LDAP_MAX_QUEUE_SIZE); - conn->request_queue = queue_init(&conn->request_array.arr); + conn->request_queue = aqueue_init(&conn->request_array.arr); conn->next = ldap_connections; ldap_connections = conn; @@ -1114,7 +1114,7 @@ i_assert(conn->to == NULL); array_free(&conn->request_array); - queue_deinit(&conn->request_queue); + aqueue_deinit(&conn->request_queue); if (conn->pass_attr_map != NULL) hash_destroy(&conn->pass_attr_map);
--- a/src/auth/db-ldap.h Sun Dec 30 17:08:29 2007 +0200 +++ b/src/auth/db-ldap.h Tue Jan 01 18:48:09 2008 +0200 @@ -121,7 +121,7 @@ /* Request queue contains sent requests at tail (msgid != -1) and queued requests at head (msgid == -1). */ - struct queue *request_queue; + struct aqueue *request_queue; ARRAY_DEFINE(request_array, struct ldap_request *); /* Number of messages in queue with msgid != -1 */ unsigned int pending_count;
--- a/src/lib/Makefile.am Sun Dec 30 17:08:29 2007 +0200 +++ b/src/lib/Makefile.am Tue Jan 01 18:48:09 2008 +0200 @@ -9,6 +9,7 @@ perl $(srcdir)/unicodemap.pl < UnicodeData.txt > $@ liblib_a_SOURCES = \ + aqueue.c \ backtrace-string.c \ base64.c \ bsearch-insert-pos.c \ @@ -77,7 +78,6 @@ primes.c \ printf-format-fix.c \ process-title.c \ - queue.c \ randgen.c \ read-full.c \ restrict-access.c \ @@ -104,6 +104,7 @@ write-full.c headers = \ + aqueue.h \ array.h \ array-decl.h \ backtrace-string.h \ @@ -160,7 +161,6 @@ primes.h \ printf-format-fix.h \ process-title.h \ - queue.h \ randgen.h \ read-full.h \ restrict-access.h \
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/aqueue.c Tue Jan 01 18:48:09 2008 +0200 @@ -0,0 +1,124 @@ +/* Copyright (c) 2003-2007 Dovecot authors, see the included COPYING file */ + +#include "lib.h" +#include "array.h" +#include "aqueue.h" + +struct aqueue *aqueue_init(struct array *array) +{ + struct aqueue *aqueue; + + aqueue = i_new(struct aqueue, 1); + aqueue->arr = array; + aqueue->area_size = buffer_get_size(aqueue->arr->buffer) / + aqueue->arr->element_size; + i_assert(aqueue->area_size > 0); + return aqueue; +} + +void aqueue_deinit(struct aqueue **_aqueue) +{ + struct aqueue *aqueue = *_aqueue; + + *_aqueue = NULL; + i_free(aqueue); +} + +static void aqueue_grow(struct aqueue *aqueue) +{ + unsigned int orig_area_size, count; + + i_assert(aqueue->full && aqueue->head == aqueue->tail); + + orig_area_size = aqueue->area_size; + (void)array_append_space_i(aqueue->arr); + aqueue->area_size = buffer_get_size(aqueue->arr->buffer) / + aqueue->arr->element_size; + i_assert(orig_area_size < aqueue->area_size); + + count = I_MIN(aqueue->area_size - orig_area_size, aqueue->head); + array_copy(aqueue->arr, orig_area_size, aqueue->arr, 0, count); + if (count < aqueue->area_size - orig_area_size) + aqueue->head = orig_area_size + count; + else { + array_copy(aqueue->arr, 0, aqueue->arr, count, + aqueue->head - count); + aqueue->head -= count; + } + + i_assert(aqueue->head != aqueue->tail); + aqueue->full = FALSE; +} + +void aqueue_append(struct aqueue *aqueue, const void *data) +{ + if (aqueue->full) { + aqueue_grow(aqueue); + i_assert(!aqueue->full); + } + + array_idx_set_i(aqueue->arr, aqueue->head, data); + aqueue->head = (aqueue->head + 1) % aqueue->area_size; + aqueue->full = aqueue->head == aqueue->tail; +} + +void aqueue_delete(struct aqueue *aqueue, unsigned int n) +{ + unsigned int idx, count = aqueue_count(aqueue); + + i_assert(n < count); + + aqueue->full = FALSE; + if (n == 0) { + /* optimized deletion from tail */ + aqueue->tail = (aqueue->tail + 1) % aqueue->area_size; + return; + } + if (n == count-1) { + /* optimized deletion from head */ + aqueue->head = (aqueue->head + aqueue->area_size - 1) % + aqueue->area_size; + return; + } + + idx = aqueue_idx(aqueue, n); + if ((n < count/2 || idx > aqueue->head) && idx > aqueue->tail) { + /* move tail forward. + ..tail##idx##head.. or ##head..tail##idx## */ + array_copy(aqueue->arr, aqueue->tail + 1, + aqueue->arr, aqueue->tail, + idx - aqueue->tail); + aqueue->tail++; + i_assert(aqueue->tail < aqueue->area_size); + } else { + /* move head backward. + ..tail##idx##head.. or ##idx##head..tail## */ + i_assert(idx < aqueue->head); + array_copy(aqueue->arr, idx, + aqueue->arr, idx + 1, + aqueue->head - idx); + aqueue->head = (aqueue->head + aqueue->area_size - 1) % + aqueue->area_size; + } + i_assert(aqueue->head < aqueue->area_size && + aqueue->head != aqueue->tail); +} + +void aqueue_delete_tail(struct aqueue *aqueue) +{ + aqueue_delete(aqueue, 0); +} + +void aqueue_clear(struct aqueue *aqueue) +{ + aqueue->head = aqueue->tail = 0; + aqueue->full = FALSE; +} + +unsigned int aqueue_count(const struct aqueue *aqueue) +{ + unsigned int area_size = aqueue->area_size; + + return aqueue->full ? area_size : + (area_size - aqueue->tail + aqueue->head) % area_size; +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/lib/aqueue.h Tue Jan 01 18:48:09 2008 +0200 @@ -0,0 +1,41 @@ +#ifndef AQUEUE_H +#define AQUEUE_H + +/* Dynamically growing queue. Use the array directly to access the data, + for example: + + count = queue_count(queue); + for (i = 0; i < count; i++) { + data = array[queue_idx(i)]; + } +*/ + +struct aqueue { + struct array *arr; + unsigned int head, tail, area_size; + bool full; +}; + +struct aqueue *aqueue_init(struct array *array); +void aqueue_deinit(struct aqueue **aqueue); + +/* Append item to head */ +void aqueue_append(struct aqueue *aqueue, const void *data); +/* Delete last item from tail */ +void aqueue_delete_tail(struct aqueue *aqueue); +/* Remove item from n'th position */ +void aqueue_delete(struct aqueue *aqueue, unsigned int n); +/* Clear the entire aqueue */ +void aqueue_clear(struct aqueue *aqueue); + +/* Returns the number of items in aqueue. */ +unsigned int aqueue_count(const struct aqueue *aqueue); + +/* Returns array index of n'th element in aqueue. */ +static inline unsigned int +aqueue_idx(const struct aqueue *aqueue, unsigned int n) +{ + return (aqueue->tail + n) % aqueue->area_size; +} + +#endif
--- a/src/lib/queue.c Sun Dec 30 17:08:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,123 +0,0 @@ -/* Copyright (c) 2003-2007 Dovecot authors, see the included COPYING file */ - -#include "lib.h" -#include "array.h" -#include "queue.h" - -struct queue *queue_init(struct array *array) -{ - struct queue *queue; - - queue = i_new(struct queue, 1); - queue->arr = array; - queue->area_size = - buffer_get_size(queue->arr->buffer) / queue->arr->element_size; - i_assert(queue->area_size > 0); - return queue; -} - -void queue_deinit(struct queue **_queue) -{ - struct queue *queue = *_queue; - - *_queue = NULL; - i_free(queue); -} - -static void queue_grow(struct queue *queue) -{ - unsigned int orig_area_size, count; - - i_assert(queue->full && queue->head == queue->tail); - - orig_area_size = queue->area_size; - (void)array_append_space_i(queue->arr); - queue->area_size = - buffer_get_size(queue->arr->buffer) / queue->arr->element_size; - i_assert(orig_area_size < queue->area_size); - - count = I_MIN(queue->area_size - orig_area_size, queue->head); - array_copy(queue->arr, orig_area_size, queue->arr, 0, count); - if (count < queue->area_size - orig_area_size) - queue->head = orig_area_size + count; - else { - array_copy(queue->arr, 0, queue->arr, count, - queue->head - count); - queue->head -= count; - } - - i_assert(queue->head != queue->tail); - queue->full = FALSE; -} - -void queue_append(struct queue *queue, const void *data) -{ - if (queue->full) { - queue_grow(queue); - i_assert(!queue->full); - } - - array_idx_set_i(queue->arr, queue->head, data); - queue->head = (queue->head + 1) % queue->area_size; - queue->full = queue->head == queue->tail; -} - -void queue_delete(struct queue *queue, unsigned int n) -{ - unsigned int idx, count = queue_count(queue); - - i_assert(n < count); - - queue->full = FALSE; - if (n == 0) { - /* optimized deletion from tail */ - queue->tail = (queue->tail + 1) % queue->area_size; - return; - } - if (n == count-1) { - /* optimized deletion from head */ - queue->head = (queue->head + queue->area_size - 1) % - queue->area_size; - return; - } - - idx = queue_idx(queue, n); - if ((n < count/2 || idx > queue->head) && idx > queue->tail) { - /* move tail forward. - ..tail##idx##head.. or ##head..tail##idx## */ - array_copy(queue->arr, queue->tail + 1, - queue->arr, queue->tail, - idx - queue->tail); - queue->tail++; - i_assert(queue->tail < queue->area_size); - } else { - /* move head backward. - ..tail##idx##head.. or ##idx##head..tail## */ - i_assert(idx < queue->head); - array_copy(queue->arr, idx, - queue->arr, idx + 1, - queue->head - idx); - queue->head = (queue->head + queue->area_size - 1) % - queue->area_size; - } - i_assert(queue->head < queue->area_size && queue->head != queue->tail); -} - -void queue_delete_tail(struct queue *queue) -{ - queue_delete(queue, 0); -} - -void queue_clear(struct queue *queue) -{ - queue->head = queue->tail = 0; - queue->full = FALSE; -} - -unsigned int queue_count(const struct queue *queue) -{ - unsigned int area_size = queue->area_size; - - return queue->full ? area_size : - (area_size - queue->tail + queue->head) % area_size; -}
--- a/src/lib/queue.h Sun Dec 30 17:08:29 2007 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -#ifndef QUEUE_H -#define QUEUE_H - -/* Dynamically growing queue. Use the array directly to access the data, - for example: - - count = queue_count(queue); - for (i = 0; i < count; i++) { - data = array[queue_idx(i)]; - } -*/ - -struct queue { - struct array *arr; - unsigned int head, tail, area_size; - bool full; -}; - -struct queue *queue_init(struct array *array); -void queue_deinit(struct queue **queue); - -/* Append item to head */ -void queue_append(struct queue *queue, const void *data); -/* Delete last item from tail */ -void queue_delete_tail(struct queue *queue); -/* Remove item from n'th position */ -void queue_delete(struct queue *queue, unsigned int n); -/* Clear the entire queue */ -void queue_clear(struct queue *queue); - -/* Returns the number of items in queue. */ -unsigned int queue_count(const struct queue *queue); - -/* Returns array index of n'th element in queue. */ -static inline unsigned int queue_idx(const struct queue *queue, unsigned int n) -{ - return (queue->tail + n) % queue->area_size; -} - -#endif
--- a/src/tests/test-lib.c Sun Dec 30 17:08:29 2007 +0200 +++ b/src/tests/test-lib.c Tue Jan 01 18:48:09 2008 +0200 @@ -5,7 +5,7 @@ #include "str.h" #include "base64.h" #include "bsearch-insert-pos.h" -#include "queue.h" +#include "aqueue.h" #include "seq-range-array.h" #include "str-sanitize.h" @@ -124,14 +124,14 @@ } } -static bool queue_is_ok(struct queue *queue, unsigned int deleted_n) +static bool aqueue_is_ok(struct aqueue *aqueue, unsigned int deleted_n) { const unsigned int *p; unsigned int n, i, count; - count = queue_count(queue); + count = aqueue_count(aqueue); for (i = 0, n = 1; i < count; i++, n++) { - p = array_idx_i(queue->arr, queue_idx(queue, i)); + p = array_idx_i(aqueue->arr, aqueue_idx(aqueue, i)); if (i == deleted_n) n++; if (*p != n) @@ -140,54 +140,54 @@ return TRUE; } -static const unsigned int queue_input[] = { 1, 2, 3, 4, 5, 6 }; -static const char *test_queue2(unsigned int initial_size) +static const unsigned int aqueue_input[] = { 1, 2, 3, 4, 5, 6 }; +static const char *test_aqueue2(unsigned int initial_size) { - ARRAY_DEFINE(queue_array, unsigned int); + ARRAY_DEFINE(aqueue_array, unsigned int); unsigned int i, j, k; - struct queue *queue; + struct aqueue *aqueue; - for (i = 0; i < N_ELEMENTS(queue_input); i++) { - for (k = 0; k < N_ELEMENTS(queue_input); k++) { - t_array_init(&queue_array, initial_size); - queue = queue_init(&queue_array.arr); - queue->head = queue->tail = initial_size - 1; + for (i = 0; i < N_ELEMENTS(aqueue_input); i++) { + for (k = 0; k < N_ELEMENTS(aqueue_input); k++) { + t_array_init(&aqueue_array, initial_size); + aqueue = aqueue_init(&aqueue_array.arr); + aqueue->head = aqueue->tail = initial_size - 1; for (j = 0; j < k; j++) { - queue_append(queue, &queue_input[j]); - if (queue_count(queue) != j + 1) { + aqueue_append(aqueue, &aqueue_input[j]); + if (aqueue_count(aqueue) != j + 1) { return t_strdup_printf("Wrong count after append %u vs %u)", - queue_count(queue), j + 1); + aqueue_count(aqueue), j + 1); } - if (!queue_is_ok(queue, -1U)) + if (!aqueue_is_ok(aqueue, -1U)) return "Invalid data after append"; } if (k != 0 && i < k) { - queue_delete(queue, i); - if (queue_count(queue) != k - 1) + aqueue_delete(aqueue, i); + if (aqueue_count(aqueue) != k - 1) return "Wrong count after delete"; - if (!queue_is_ok(queue, i)) + if (!aqueue_is_ok(aqueue, i)) return "Invalid data after delete"; } } } - queue_clear(queue); - if (queue_count(queue) != 0) - return "queue_clear() broken"; + aqueue_clear(aqueue); + if (aqueue_count(aqueue) != 0) + return "aqueue_clear() broken"; return NULL; } -static void test_queue(void) +static void test_aqueue(void) { unsigned int i; const char *reason = NULL; - for (i = 1; i <= N_ELEMENTS(queue_input) + 1 && reason == NULL; i++) { + for (i = 1; i <= N_ELEMENTS(aqueue_input) + 1 && reason == NULL; i++) { T_FRAME( - reason = test_queue2(i); + reason = test_aqueue2(i); ); } - test_out_reason("queue", reason == NULL, reason); + test_out_reason("aqueue", reason == NULL, reason); } static void test_seq_range_array(void) @@ -274,7 +274,7 @@ test_base64_encode, test_base64_decode, test_bsearch_insert_pos, - test_queue, + test_aqueue, test_seq_range_array, test_str_sanitize,