isync

mailbox synchronization program
git clone https://git.code.sf.net/p/isync/isync
Log | Files | Refs | README | LICENSE

commit ae95490d5256372ad25ca1be5d7f7d1bfad051f6
parent 7b567164fff524b8d9ddbe09a8ffa78f66c6f8b5
Author: Oswald Buddenhagen <ossi@users.sf.net>
Date:   Fri,  4 Nov 2016 21:09:02 +0100

pre-sort exception list passed to driver->load_box()

... and use that to optimize the maildir driver somewhat.

Diffstat:
Msrc/common.h | 1+
Msrc/drv_imap.c | 1-
Msrc/drv_maildir.c | 9++-------
Msrc/sync.c | 1+
Msrc/util.c | 17+++++++++++++++++
5 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/common.h b/src/common.h @@ -167,6 +167,7 @@ int map_name( const char *arg, char **result, int reserve, const char *in, const DEFINE_ARRAY_TYPE(int) void sort_int_array( int_array_t array ); +int find_int_array( const int_array_t array, int value ); void arc4_init( void ); uchar arc4_getbyte( void ); diff --git a/src/drv_imap.c b/src/drv_imap.c @@ -2305,7 +2305,6 @@ imap_load_box( store_t *gctx, int minuid, int maxuid, int newuid, int_array_t ex } else { struct imap_cmd_refcounted_state *sts = imap_refcounted_new_state( cb, aux ); - sort_int_array( excs ); for (i = 0; i < excs.size; ) { for (bl = 0; i < excs.size && bl < 960; i++) { if (bl) diff --git a/src/drv_maildir.c b/src/drv_maildir.c @@ -831,7 +831,7 @@ maildir_scan( maildir_store_t *ctx, msg_t_array_alloc_t *msglist ) DBC *dbc; #endif /* USE_DB */ msg_t *entry; - int i, j, uid, bl, fnl, ret; + int i, uid, bl, fnl, ret; time_t now, stamps[2]; struct stat st; char buf[_POSIX_PATH_MAX], nbuf[_POSIX_PATH_MAX]; @@ -922,13 +922,8 @@ maildir_scan( maildir_store_t *ctx, msg_t_array_alloc_t *msglist ) uid = INT_MAX; } if (uid <= ctx->maxuid) { - if (uid < ctx->minuid) { - for (j = 0; j < ctx->excs.size; j++) - if (ctx->excs.data[j] == uid) - goto oke; + if (uid < ctx->minuid && !find_int_array( ctx->excs, uid )) continue; - oke: ; - } entry = msg_t_array_append( msglist ); entry->base = nfstrdup( e->d_name ); entry->uid = uid; diff --git a/src/sync.c b/src/sync.c @@ -1276,6 +1276,7 @@ box_opened2( sync_vars_t *svars, int t ) minwuid = INT_MAX; } sync_ref( svars ); + sort_int_array( mexcs.array ); load_box( svars, M, minwuid, mexcs.array ); if (!check_cancel( svars )) load_box( svars, S, (ctx[S]->opts & OPEN_OLD) ? 1 : INT_MAX, (int_array_t){ 0, 0 } ); diff --git a/src/util.c b/src/util.c @@ -545,6 +545,23 @@ sort_int_array( int_array_t array ) qsort( array.data, array.size, sizeof(int), compare_ints ); } +int +find_int_array( int_array_t array, int value ) +{ + int bot = 0, top = array.size - 1; + while (bot <= top) { + int i = (bot + top) / 2; + int elt = array.data[i]; + if (elt == value) + return 1; + if (elt < value) + bot = i + 1; + else + top = i - 1; + } + return 0; +} + static struct { uchar i, j, s[256];