dovecot: mail_index_seq_array_lookup() didn't return idx_r corre...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Aug 6 17:30:07 EEST 2007
details: http://hg.dovecot.org/dovecot/rev/eb307524cf16
changeset: 6169:eb307524cf16
user: Timo Sirainen <tss at iki.fi>
date: Mon Aug 06 17:12:00 2007 +0300
description:
mail_index_seq_array_lookup() didn't return idx_r correctly always, which
could have caused out-of-order mail_index_update_ext() calls to break. We'll
use bsearch_insert_pos() now instead of our own duplicated code.
diffstat:
1 file changed, 15 insertions(+), 32 deletions(-)
src/lib-index/mail-index-transaction.c | 47 ++++++++++----------------------
diffs (67 lines):
diff -r 28d1cfbbce6e -r eb307524cf16 src/lib-index/mail-index-transaction.c
--- a/src/lib-index/mail-index-transaction.c Mon Aug 06 16:31:48 2007 +0300
+++ b/src/lib-index/mail-index-transaction.c Mon Aug 06 17:12:00 2007 +0300
@@ -7,6 +7,7 @@
#include "lib.h"
#include "ioloop.h"
#include "array.h"
+#include "bsearch-insert-pos.h"
#include "seq-range-array.h"
#include "mail-index-view-private.h"
#include "mail-transaction-log.h"
@@ -127,41 +128,23 @@ void mail_index_transaction_unref(struct
mail_index_transaction_free(t);
}
+static int mail_index_seq_record_cmp(const void *key, const void *data)
+{
+ const uint32_t *seq_p = key;
+ const uint32_t *data_seq = data;
+
+ return *seq_p - *data_seq;
+}
+
bool mail_index_seq_array_lookup(const ARRAY_TYPE(seq_array) *array,
uint32_t seq, unsigned int *idx_r)
{
- unsigned int idx, left_idx, right_idx, count;
- const uint32_t *seq_p;
-
- count = array_count(array);
- if (count == 0) {
- *idx_r = 0;
- return FALSE;
- }
-
- /* we're probably appending it, check */
- seq_p = array_idx(array, count-1);
- if (*seq_p < seq)
- idx = count;
- else {
- idx = 0; left_idx = 0; right_idx = count;
- while (left_idx < right_idx) {
- idx = (left_idx + right_idx) / 2;
-
- seq_p = array_idx(array, idx);
- if (*seq_p < seq)
- left_idx = idx+1;
- else if (*seq_p > seq)
- right_idx = idx;
- else {
- *idx_r = idx;
- return TRUE;
- }
- }
- }
-
- *idx_r = idx;
- return FALSE;
+ const void *base;
+ unsigned int count;
+
+ base = array_get(array, &count);
+ return bsearch_insert_pos(&seq, base, count, array->arr.element_size,
+ mail_index_seq_record_cmp, idx_r);
}
static bool mail_index_seq_array_add(ARRAY_TYPE(seq_array) *array, uint32_t seq,
More information about the dovecot-cvs
mailing list