[dovecot-cvs] dovecot/src/lib-index mail-index-private.h, 1.58, 1.59 mail-index-sync-ext.c, 1.13, 1.14 mail-index-transaction-view.c, 1.14, 1.15 mail-index-transaction.c, 1.69, 1.70 mail-index.c, 1.209, 1.210 mail-transaction-log-append.c, 1.12, 1.13

cras at dovecot.org cras at dovecot.org
Fri Jan 6 14:48:57 EET 2006


Update of /var/lib/cvs/dovecot/src/lib-index
In directory talvi:/tmp/cvs-serv16722

Modified Files:
	mail-index-private.h mail-index-sync-ext.c 
	mail-index-transaction-view.c mail-index-transaction.c 
	mail-index.c mail-transaction-log-append.c 
Log Message:
Cleanup: Created mail_index_registered_ext which is used for
index->extensions array. Put sync_handler to it and removed sync_handlers
array.



Index: mail-index-private.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index-private.h,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -d -r1.58 -r1.59
--- mail-index-private.h	2 Jan 2006 12:22:41 -0000	1.58
+++ mail-index-private.h	6 Jan 2006 12:48:55 -0000	1.59
@@ -45,8 +45,8 @@
 	const char *name;
 	uint32_t index_idx; /* index ext_id */
 	uint32_t reset_id;
-	uint32_t hdr_offset; /* points to data[] */
-	uint32_t hdr_size; /* size of data[] */
+	uint32_t hdr_offset; /* points to mail_index_ext_header.data[] */
+	uint32_t hdr_size; /* size of mail_index_ext_header.data[] */
 	uint16_t record_offset;
 	uint16_t record_size;
 	uint16_t record_align;
@@ -74,6 +74,26 @@
 	uint32_t name_offset; /* relative to beginning of name[] */
 };
 
+enum mail_index_sync_handler_type {
+	MAIL_INDEX_SYNC_HANDLER_INDEX	= 0x01,
+	MAIL_INDEX_SYNC_HANDLER_VIEW	= 0x02
+};
+
+struct mail_index_sync_handler {
+	mail_index_sync_handler_t *callback;
+        enum mail_index_sync_handler_type type;
+};
+
+struct mail_index_registered_ext {
+	const char *name;
+	uint32_t index_idx; /* index ext_id */
+	uint32_t hdr_size; /* size of mail_index_ext_header.data[] */
+	uint16_t record_size;
+	uint16_t record_align;
+
+        struct mail_index_sync_handler sync_handler;
+};
+
 struct mail_index_map {
 	int refcount;
 
@@ -113,10 +133,9 @@
 	gid_t gid;
 
 	pool_t extension_pool;
-	array_t ARRAY_DEFINE(extensions, struct mail_index_ext);
+	array_t ARRAY_DEFINE(extensions, struct mail_index_registered_ext);
 
 	array_t ARRAY_DEFINE(expunge_handlers, mail_index_expunge_handler_t *);
-	array_t ARRAY_DEFINE(sync_handlers, struct mail_index_sync_handler);
 	array_t ARRAY_DEFINE(sync_lost_handlers,
 			     mail_index_sync_lost_handler_t *);
 
@@ -159,16 +178,6 @@
 	unsigned int mapping:1;
 };
 
-enum mail_index_sync_handler_type {
-	MAIL_INDEX_SYNC_HANDLER_INDEX	= 0x01,
-	MAIL_INDEX_SYNC_HANDLER_VIEW	= 0x02
-};
-
-struct mail_index_sync_handler {
-	mail_index_sync_handler_t *callback;
-        enum mail_index_sync_handler_type type;
-};
-
 /* Add/replace sync handler for specified extra record. */
 void mail_index_register_expunge_handler(struct mail_index *index,
 					 uint32_t ext_id,

Index: mail-index-sync-ext.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index-sync-ext.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -d -r1.13 -r1.14
--- mail-index-sync-ext.c	2 Jan 2006 12:22:41 -0000	1.13
+++ mail-index-sync-ext.c	6 Jan 2006 12:48:55 -0000	1.14
@@ -101,34 +101,30 @@
 
 void mail_index_sync_deinit_handlers(struct mail_index_sync_map_ctx *ctx)
 {
-	const struct mail_index_sync_handler *sync_handlers;
 	const struct mail_index_ext *ext;
+	const struct mail_index_registered_ext *rext;
 	void **extra_contexts;
-	unsigned int i, count, synch_count, context_count;
+	unsigned int i, count, rext_count, context_count;
 
 	if (!array_is_created(&ctx->extra_contexts))
 		return;
 
-	sync_handlers =
-		array_get(&ctx->view->index->sync_handlers, &synch_count);
-
 	if (!array_is_created(&ctx->view->map->extensions)) {
 		ext = NULL;
 		count = 0;
 	} else {
 		ext = array_get(&ctx->view->map->extensions, &count);
-		i_assert(count <= synch_count);
 	}
+	rext = array_get(&ctx->view->index->extensions, &rext_count);
 
-	/* sync_handlers[] is ordered by index->extensions while
-	   extra_contexts[] is ordered by map->extensions. */
+	/* extra_contexts[] is ordered by map->extensions. */
 	extra_contexts =
 		array_get_modifyable(&ctx->extra_contexts, &context_count);
 	i_assert(count <= context_count);
 
 	for (i = 0; i < count; i++) {
 		if (extra_contexts[i] != NULL) {
-			sync_handlers[ext[i].index_idx].
+			rext[ext[i].index_idx].sync_handler.
 				callback(ctx, 0, NULL, NULL,
 					 &extra_contexts[i]);
 		}
@@ -518,8 +514,8 @@
 {
 	struct mail_index_view *view = ctx->view;
 	struct mail_index_record *rec;
-        const struct mail_index_sync_handler *sync_handlers;
 	const struct mail_index_ext *ext;
+	const struct mail_index_registered_ext *rext;
 	void *old_data;
 	uint32_t seq;
 	int ret;
@@ -538,15 +534,16 @@
 	rec = MAIL_INDEX_MAP_IDX(view->map, seq-1);
 	old_data = PTR_OFFSET(rec, ext->record_offset);
 
-	sync_handlers = array_idx(&view->index->sync_handlers, ext->index_idx);
+	rext = array_idx(&view->index->extensions, ext->index_idx);
 
-	/* call sync handlers only when we're syncing index (not view) */
-	if ((sync_handlers->type & ctx->type) != 0) {
+	/* call sync handlers only when its registered type matches with
+	   current synchronization type (index/view) */
+	if ((rext->sync_handler.type & ctx->type) != 0) {
 		void **extra_context =
 			array_idx_modifyable(&ctx->extra_contexts,
 					     ctx->cur_ext_id);
-		ret = sync_handlers->callback(ctx, seq, old_data, u + 1,
-					      extra_context);
+		ret = rext->sync_handler.callback(ctx, seq, old_data, u + 1,
+						  extra_context);
 		if (ret <= 0)
 			return ret;
 	}

Index: mail-index-transaction-view.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index-transaction-view.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -d -r1.14 -r1.15
--- mail-index-transaction-view.c	4 Jul 2005 11:32:20 -0000	1.14
+++ mail-index-transaction-view.c	6 Jan 2006 12:48:55 -0000	1.15
@@ -136,7 +136,6 @@
 {
 	struct mail_index_view_transaction *tview =
 		(struct mail_index_view_transaction *)view;
-        const struct mail_index_ext *ext;
 	const array_t *ext_buf;
 	ARRAY_SET_TYPE(ext_buf, void *);
 	const void *data;
@@ -146,7 +145,6 @@
 
 	*map_r = view->index->map;
 
-	ext = array_idx(&view->index->extensions, ext_id);
 	if (array_is_created(&tview->t->ext_rec_updates) &&
 	    ext_id < array_count(&tview->t->ext_rec_updates)) {
 		/* there are some ext updates in transaction.

Index: mail-index-transaction.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index-transaction.c,v
retrieving revision 1.69
retrieving revision 1.70
diff -u -d -r1.69 -r1.70
--- mail-index-transaction.c	21 Dec 2005 18:41:50 -0000	1.69
+++ mail-index-transaction.c	6 Jan 2006 12:48:55 -0000	1.70
@@ -627,22 +627,32 @@
 			   uint16_t record_align)
 {
 	struct mail_transaction_ext_intro intro;
-	const struct mail_index_ext *ext;
+	uint32_t old_record_size, old_record_align;
 
 	memset(&intro, 0, sizeof(intro));
 
+	/* get ext_id from transaction's map if it's there */
 	if (!mail_index_map_get_ext_idx(t->view->map, ext_id, &intro.ext_id)) {
+		/* have to create it */
+		const struct mail_index_registered_ext *rext;
+
 		intro.ext_id = (uint32_t)-1;
-		ext = array_idx(&t->view->index->extensions, ext_id);
+		rext = array_idx(&t->view->index->extensions, ext_id);
+		old_record_size = rext->record_size;
+		old_record_align = rext->record_align;
 	} else {
+		const struct mail_index_ext *ext;
+
 		ext = array_idx(&t->view->map->extensions, ext_id);
+		old_record_size = ext->record_size;
+		old_record_align = ext->record_align;
 	}
 
 	/* allow only header size changes if extension records have already
 	   been changed in transaction */
 	i_assert(!array_is_created(&t->ext_rec_updates) ||
-		 (ext->record_size == record_size &&
-		  ext->record_align == record_align));
+		 (old_record_size == record_size &&
+		  old_record_align == record_align));
 
 	t->log_updates = TRUE;
 
@@ -693,7 +703,7 @@
 			   uint32_t ext_id, const void *data, void *old_data_r)
 {
 	struct mail_index *index = t->view->index;
-        const struct mail_index_ext *ext;
+        const struct mail_index_registered_ext *rext;
 	const struct mail_transaction_ext_intro *intro;
 	uint16_t record_size;
 	array_t *array;
@@ -716,8 +726,8 @@
 		/* resized record */
 		record_size = intro[ext_id].record_size;
 	} else {
-		ext = array_idx(&index->extensions, ext_id);
-		record_size = ext->record_size;
+		rext = array_idx(&index->extensions, ext_id);
+		record_size = rext->record_size;
 	}
 
 	if (!array_is_created(&t->ext_rec_updates)) {

Index: mail-index.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index.c,v
retrieving revision 1.209
retrieving revision 1.210
diff -u -d -r1.209 -r1.210
--- mail-index.c	18 Sep 2005 15:40:30 -0000	1.209
+++ mail-index.c	6 Jan 2006 12:48:55 -0000	1.210
@@ -32,12 +32,10 @@
 
 	index->extension_pool = pool_alloconly_create("extension", 512);
 	ARRAY_CREATE(&index->extensions, index->extension_pool,
-		     struct mail_index_ext, 5);
+		     struct mail_index_registered_ext, 5);
 
 	ARRAY_CREATE(&index->expunge_handlers, default_pool,
 		     mail_index_expunge_handler_t *, 4);
-	ARRAY_CREATE(&index->sync_handlers, default_pool,
-		     struct mail_index_sync_handler, 4);
 	ARRAY_CREATE(&index->sync_lost_handlers, default_pool,
 		     mail_index_sync_lost_handler_t *, 4);
 
@@ -62,7 +60,6 @@
 	pool_unref(index->extension_pool);
 	pool_unref(index->keywords_pool);
 
-	array_free(&index->sync_handlers);
 	array_free(&index->sync_lost_handlers);
 	array_free(&index->expunge_handlers);
 	array_free(&index->keywords);
@@ -85,29 +82,26 @@
 				 uint16_t default_record_size,
 				 uint16_t default_record_align)
 {
-        const struct mail_index_ext *extensions;
-	struct mail_index_ext ext;
+        const struct mail_index_registered_ext *extensions;
+	struct mail_index_registered_ext rext;
 	unsigned int i, ext_count;
 
 	extensions = array_get(&index->extensions, &ext_count);
 
-	i_assert(array_count(&index->sync_handlers) == ext_count);
-
 	/* see if it's already there */
 	for (i = 0; i < ext_count; i++) {
 		if (strcmp(extensions[i].name, name) == 0)
 			return i;
 	}
 
-	memset(&ext, 0, sizeof(ext));
-	ext.name = p_strdup(index->extension_pool, name);
-	ext.index_idx = ext_count;
-	ext.hdr_size = default_hdr_size;
-	ext.record_size = default_record_size;
-	ext.record_align = default_record_align;
+	memset(&rext, 0, sizeof(rext));
+	rext.name = p_strdup(index->extension_pool, name);
+	rext.index_idx = ext_count;
+	rext.hdr_size = default_hdr_size;
+	rext.record_size = default_record_size;
+	rext.record_align = default_record_align;
 
-	array_append(&index->extensions, &ext, 1);
-	(void)array_append_space(&index->sync_handlers);
+	array_append(&index->extensions, &rext, 1);
 	return ext_count;
 }
 
@@ -138,25 +132,25 @@
 				      mail_index_sync_handler_t *cb,
 				      enum mail_index_sync_handler_type type)
 {
-	struct mail_index_sync_handler *h;
+	struct mail_index_registered_ext *rext;
 
-	h = array_idx_modifyable(&index->sync_handlers, ext_id);
-	i_assert(h->callback == NULL);
+	rext = array_idx_modifyable(&index->extensions, ext_id);
+	i_assert(rext->sync_handler.callback == NULL);
 
-	h->callback = cb;
-	h->type = type;
+	rext->sync_handler.callback = cb;
+	rext->sync_handler.type = type;
 }
 
 void mail_index_unregister_sync_handler(struct mail_index *index,
 					uint32_t ext_id)
 {
-	struct mail_index_sync_handler *h;
+	struct mail_index_registered_ext *rext;
 
-	h = array_idx_modifyable(&index->sync_handlers, ext_id);
-	i_assert(h->callback != NULL);
+	rext = array_idx_modifyable(&index->extensions, ext_id);
+	i_assert(rext->sync_handler.callback != NULL);
 
-	h->callback = NULL;
-	h->type = 0;
+	rext->sync_handler.callback = NULL;
+	rext->sync_handler.type = 0;
 }
 
 void mail_index_register_sync_lost_handler(struct mail_index *index,

Index: mail-transaction-log-append.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-transaction-log-append.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -d -r1.12 -r1.13
--- mail-transaction-log-append.c	18 Aug 2005 16:55:25 -0000	1.12
+++ mail-transaction-log-append.c	6 Jan 2006 12:48:55 -0000	1.13
@@ -117,7 +117,7 @@
 				struct mail_index_transaction *t,
 				uint32_t ext_id, uint32_t reset_id)
 {
-	const struct mail_index_ext *ext;
+	const struct mail_index_registered_ext *rext;
         struct mail_transaction_ext_intro *intro;
 	buffer_t *buf;
 	uint32_t idx;
@@ -128,7 +128,7 @@
 		idx = (uint32_t)-1;
 	}
 
-	ext = array_idx(&t->view->index->extensions, ext_id);
+	rext = array_idx(&t->view->index->extensions, ext_id);
 	if (!array_is_created(&t->ext_resizes)) {
 		intro = NULL;
 		count = 0;
@@ -143,17 +143,17 @@
 
 		i_assert(intro->ext_id == idx);
 		intro->name_size = idx != (uint32_t)-1 ? 0 :
-			strlen(ext->name);
+			strlen(rext->name);
 		buffer_append(buf, intro, sizeof(*intro));
 	} else {
 		/* generate a new intro structure */
 		intro = buffer_append_space_unsafe(buf, sizeof(*intro));
 		intro->ext_id = idx;
-		intro->hdr_size = ext->hdr_size;
-		intro->record_size = ext->record_size;
-		intro->record_align = ext->record_align;
+		intro->hdr_size = rext->hdr_size;
+		intro->record_size = rext->record_size;
+		intro->record_align = rext->record_align;
 		intro->name_size = idx != (uint32_t)-1 ? 0 :
-			strlen(ext->name);
+			strlen(rext->name);
 	}
 	if (reset_id != 0) {
 		/* we're going to reset this extension in this transaction */
@@ -166,7 +166,7 @@
 	} else {
 		/* new extension, reset_id defaults to 0 */
 	}
-	buffer_append(buf, ext->name, intro->name_size);
+	buffer_append(buf, rext->name, intro->name_size);
 
 	if ((buf->used % 4) != 0)
 		buffer_append_zero(buf, 4 - (buf->used % 4));



More information about the dovecot-cvs mailing list