dovecot-2.0: maildir: Use array_bsearch() in uidlist instead of ...

dovecot at dovecot.org dovecot at dovecot.org
Thu Sep 16 18:26:52 EEST 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/6a99212b636d
changeset: 12127:6a99212b636d
user:      Timo Sirainen <tss at iki.fi>
date:      Thu Sep 16 16:26:48 2010 +0100
description:
maildir: Use array_bsearch() in uidlist instead of reimplementing it.

diffstat:

 src/lib-storage/index/maildir/maildir-uidlist.c |  48 ++++++++++--------------
 1 files changed, 20 insertions(+), 28 deletions(-)

diffs (107 lines):

diff -r 0540815363b6 -r 6a99212b636d src/lib-storage/index/maildir/maildir-uidlist.c
--- a/src/lib-storage/index/maildir/maildir-uidlist.c	Thu Sep 16 15:19:45 2010 +0100
+++ b/src/lib-storage/index/maildir/maildir-uidlist.c	Thu Sep 16 16:26:48 2010 +0100
@@ -990,12 +990,18 @@
 }
 
 static int
+maildir_uid_bsearch_cmp(const uint32_t *uidp,
+			struct maildir_uidlist_rec *const *recp)
+{
+	return *uidp < (*recp)->uid ? -1 :
+		*uidp > (*recp)->uid ? 1 : 0;
+}
+
+static int
 maildir_uidlist_lookup_rec(struct maildir_uidlist *uidlist, uint32_t uid,
-			   unsigned int *idx_r,
 			   struct maildir_uidlist_rec **rec_r)
 {
-	struct maildir_uidlist_rec *const *recs;
-	unsigned int idx, left_idx, right_idx;
+	struct maildir_uidlist_rec *const *pos;
 
 	if (!uidlist->initial_read) {
 		/* first time we need to read uidlist */
@@ -1003,25 +1009,14 @@
 			return -1;
 	}
 
-	idx = left_idx = 0;
-	recs = array_get(&uidlist->records, &right_idx);
-	while (left_idx < right_idx) {
-		idx = (left_idx + right_idx) / 2;
-
-		if (recs[idx]->uid < uid)
-			left_idx = idx+1;
-		else if (recs[idx]->uid > uid)
-			right_idx = idx;
-		else {
-			*idx_r = idx;
-			*rec_r = recs[idx];
-			return 1;
-		}
+	pos = array_bsearch(&uidlist->records, &uid,
+			    maildir_uid_bsearch_cmp);
+	if (pos == NULL) {
+		*rec_r = NULL;
+		return 0;
 	}
-
-	if (idx > 0) idx--;
-	*idx_r = idx;
-	return 0;
+	*rec_r = *pos;
+	return 1;
 }
 
 int maildir_uidlist_lookup(struct maildir_uidlist *uidlist, uint32_t uid,
@@ -1058,10 +1053,9 @@
 				  const char **fname_r)
 {
 	struct maildir_uidlist_rec *rec;
-	unsigned int idx;
 	int ret;
 
-	if ((ret = maildir_uidlist_lookup_rec(uidlist, uid, &idx, &rec)) <= 0)
+	if ((ret = maildir_uidlist_lookup_rec(uidlist, uid, &rec)) <= 0)
 		return ret;
 
 	*flags_r = rec->flags;
@@ -1074,11 +1068,10 @@
 			   enum maildir_uidlist_rec_ext_key key)
 {
 	struct maildir_uidlist_rec *rec;
-	unsigned int idx;
 	const unsigned char *p;
 	int ret;
 
-	ret = maildir_uidlist_lookup_rec(uidlist, uid, &idx, &rec);
+	ret = maildir_uidlist_lookup_rec(uidlist, uid, &rec);
 	if (ret <= 0 || rec->extensions == NULL)
 		return NULL;
 
@@ -1153,13 +1146,12 @@
 			     const char *value)
 {
 	struct maildir_uidlist_rec *rec;
-	unsigned int idx;
 	const unsigned char *p;
 	buffer_t *buf;
 	unsigned int len;
 	int ret;
 
-	ret = maildir_uidlist_lookup_rec(uidlist, uid, &idx, &rec);
+	ret = maildir_uidlist_lookup_rec(uidlist, uid, &rec);
 	if (ret <= 0) {
 		if (ret < 0)
 			return;
@@ -1167,7 +1159,7 @@
 		/* maybe it's a new message */
 		if (maildir_uidlist_refresh(uidlist) < 0)
 			return;
-		if (maildir_uidlist_lookup_rec(uidlist, uid, &idx, &rec) <= 0) {
+		if (maildir_uidlist_lookup_rec(uidlist, uid, &rec) <= 0) {
 			/* message is already expunged, ignore */
 			return;
 		}


More information about the dovecot-cvs mailing list