# HG changeset patch # User Timo Sirainen # Date 1186409520 -10800 # Node ID eb307524cf16c6ed4509997c967d2e0565170eb6 # Parent 28d1cfbbce6e71b06277cb21afde450665a46538 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. 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 @@ 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; - } + const void *base; + unsigned int count; - /* 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; + 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,