dovecot-2.1: seq_range_array_add(): Ranges weren't always merged...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Apr 30 22:53:31 EEST 2012
details: http://hg.dovecot.org/dovecot-2.1/rev/bac5e1dae4ed
changeset: 14491:bac5e1dae4ed
user: Timo Sirainen <tss at iki.fi>
date: Mon Apr 30 22:53:19 2012 +0300
description:
seq_range_array_add(): Ranges weren't always merged when they could have.
This didn't break anything, but it used up more memory than necessary.
diffstat:
src/lib/seq-range-array.c | 22 +++++++++++++---------
src/lib/test-seq-range-array.c | 16 +++++++++++++++-
2 files changed, 28 insertions(+), 10 deletions(-)
diffs (73 lines):
diff -r 2f776ca73cef -r bac5e1dae4ed src/lib/seq-range-array.c
--- a/src/lib/seq-range-array.c Sat Apr 28 18:24:24 2012 +0300
+++ b/src/lib/seq-range-array.c Mon Apr 30 22:53:19 2012 +0300
@@ -86,16 +86,20 @@
data[idx-1].seq2 = data[idx].seq2;
array_delete(array, idx, 1);
}
- } else if (data[idx].seq2 == seq-1) {
- i_assert(idx+1 < count); /* already handled above */
- data[idx].seq2 = seq;
- if (data[idx+1].seq1 == seq+1) {
- /* merge */
- data[idx+1].seq1 = data[idx].seq1;
- array_delete(array, idx, 1);
+ } else {
+ if (idx > 0 && data[idx-1].seq2 == seq-1)
+ idx--;
+ if (data[idx].seq2 == seq-1) {
+ i_assert(idx+1 < count); /* already handled above */
+ data[idx].seq2 = seq;
+ if (data[idx+1].seq1 == seq+1) {
+ /* merge */
+ data[idx+1].seq1 = data[idx].seq1;
+ array_delete(array, idx, 1);
+ }
+ } else {
+ array_insert(array, idx, &value, 1);
}
- } else {
- array_insert(array, idx, &value, 1);
}
return FALSE;
}
diff -r 2f776ca73cef -r bac5e1dae4ed src/lib/test-seq-range-array.c
--- a/src/lib/test-seq-range-array.c Sat Apr 28 18:24:24 2012 +0300
+++ b/src/lib/test-seq-range-array.c Mon Apr 30 22:53:19 2012 +0300
@@ -6,6 +6,19 @@
#include <stdlib.h>
+static void test_seq_range_array_add_merge(void)
+{
+ ARRAY_TYPE(seq_range) range;
+
+ test_begin("seq_range_array_add() merging");
+ t_array_init(&range, 8);
+ seq_range_array_add(&range, 0, 4);
+ seq_range_array_add(&range, 0, 1);
+ seq_range_array_add(&range, 0, 2);
+ test_assert(array_count(&range) == 2);
+ test_end();
+}
+
static void test_seq_range_array_random(void)
{
#define SEQ_RANGE_TEST_BUFSIZE 20
@@ -53,7 +66,7 @@
seqs = array_get(&range, &count);
for (j = 0, seq1 = 0; j < count; j++) {
- if (j > 0 && seqs[j-1].seq2 >= seqs[j].seq1)
+ if (j > 0 && seqs[j-1].seq2+1 >= seqs[j].seq1)
goto fail;
for (; seq1 < seqs[j].seq1; seq1++) {
if (shadowbuf[seq1] != 0)
@@ -156,6 +169,7 @@
void test_seq_range_array(void)
{
+ test_seq_range_array_add_merge();
test_seq_range_array_invert();
test_seq_range_array_have_common();
test_seq_range_array_random();
More information about the dovecot-cvs
mailing list