[dovecot-cvs] dovecot/src/lib-index mail-cache-sync-update.c, 1.2, 1.3 mail-cache.c, 1.53, 1.54 mail-index-private.h, 1.34, 1.35 mail-index-sync-private.h, 1.15, 1.16 mail-index-sync-update.c, 1.54, 1.55 mail-index-view-sync.c, 1.27, 1.28 mail-index.c, 1.162, 1.163

cras at dovecot.org cras at dovecot.org
Mon Nov 8 03:21:17 EET 2004


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

Modified Files:
	mail-cache-sync-update.c mail-cache.c mail-index-private.h 
	mail-index-sync-private.h mail-index-sync-update.c 
	mail-index-view-sync.c mail-index.c 
Log Message:
Cache invalidating needed to hook into view syncing as well.



Index: mail-cache-sync-update.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-cache-sync-update.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -d -r1.2 -r1.3
--- mail-cache-sync-update.c	8 Nov 2004 00:40:41 -0000	1.2
+++ mail-cache-sync-update.c	8 Nov 2004 01:21:14 -0000	1.3
@@ -115,7 +115,8 @@
 				      (size_t)-1);
 	}
 
-	if (*old_cache_offset == 0)
+	if (*old_cache_offset == 0 ||
+	    sync_ctx->type != MAIL_INDEX_SYNC_HANDLER_INDEX)
 		return 1;
 
 	/* we'll need to link the old and new cache records */

Index: mail-cache.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-cache.c,v
retrieving revision 1.53
retrieving revision 1.54
diff -u -d -r1.53 -r1.54
--- mail-cache.c	8 Nov 2004 00:55:02 -0000	1.53
+++ mail-cache.c	8 Nov 2004 01:21:14 -0000	1.54
@@ -270,7 +270,8 @@
 	mail_index_register_expunge_handler(index, cache->ext_id,
 					    mail_cache_expunge_handler);
 	mail_index_register_sync_handler(index, cache->ext_id,
-					 mail_cache_sync_handler);
+					 mail_cache_sync_handler,
+					 cache->file_cache != NULL);
 	return cache;
 }
 

Index: mail-index-private.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index-private.h,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -d -r1.34 -r1.35
--- mail-index-private.h	6 Nov 2004 17:20:18 -0000	1.34
+++ mail-index-private.h	8 Nov 2004 01:21:14 -0000	1.35
@@ -127,12 +127,23 @@
 	unsigned int fsck: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,
 					 mail_index_expunge_handler_t *cb);
 void mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
-				      mail_index_sync_handler_t *cb);
+				      mail_index_sync_handler_t *cb,
+				      enum mail_index_sync_handler_type type);
 
 int mail_index_write_base_header(struct mail_index *index,
 				 const struct mail_index_header *hdr);

Index: mail-index-sync-private.h
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index-sync-private.h,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -d -r1.15 -r1.16
--- mail-index-sync-private.h	6 Nov 2004 17:20:18 -0000	1.15
+++ mail-index-sync-private.h	8 Nov 2004 01:21:14 -0000	1.16
@@ -40,6 +40,8 @@
 	buffer_t *extra_context_buf;
 	void **extra_context;
 
+        enum mail_index_sync_handler_type type;
+
 	unsigned int sync_handlers_initialized:1;
 	unsigned int expunge_handlers_set:1;
 	unsigned int expunge_handlers_used:1;
@@ -49,7 +51,9 @@
 extern struct mail_transaction_map_functions mail_index_map_sync_funcs;
 
 void mail_index_sync_map_init(struct mail_index_sync_map_ctx *sync_map_ctx,
-			      struct mail_index_view *view);
+			      struct mail_index_view *view,
+			      enum mail_index_sync_handler_type type);
+void mail_index_sync_map_deinit(struct mail_index_sync_map_ctx *sync_map_ctx);
 int mail_index_sync_update_index(struct mail_index_sync_ctx *sync_ctx,
 				 int sync_only_external);
 

Index: mail-index-sync-update.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index-sync-update.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -d -r1.54 -r1.55
--- mail-index-sync-update.c	7 Nov 2004 18:44:58 -0000	1.54
+++ mail-index-sync-update.c	8 Nov 2004 01:21:14 -0000	1.55
@@ -109,12 +109,11 @@
 		buffer_get_modifyable_data(ctx->extra_context_buf, NULL);
 
 	ctx->expunge_handlers_set = FALSE;
-	ctx->sync_handlers_initialized = TRUE;
 }
 
 static void mail_index_sync_deinit_handlers(struct mail_index_sync_map_ctx *ctx)
 {
-	mail_index_sync_handler_t *const *sync_handlers;
+        const struct mail_index_sync_handler *sync_handlers;
 	size_t i, size;
 
 	if (ctx->extra_context == NULL)
@@ -127,8 +126,8 @@
 
 	for (i = 0; i < size; i++) {
 		if (ctx->extra_context[i] != NULL) {
-			sync_handlers[i](ctx, 0, NULL, NULL,
-					 &ctx->extra_context[i]);
+			sync_handlers[i].callback(ctx, 0, NULL, NULL,
+						  &ctx->extra_context[i]);
 		}
 	}
 
@@ -216,7 +215,7 @@
 	if (seq1 == 0)
 		return 1;
 
-	if (ctx->sync_handlers_initialized) {
+	if (ctx->type != MAIL_INDEX_SYNC_HANDLER_VIEW) {
 		if (!ctx->expunge_handlers_set)
 			mail_index_sync_init_expunge_handlers(ctx);
 
@@ -743,7 +742,7 @@
         struct mail_index_sync_map_ctx *ctx = context;
 	struct mail_index_view *view = ctx->view;
 	struct mail_index_record *rec;
-	mail_index_sync_handler_t *const *sync_handlers;
+        const struct mail_index_sync_handler *sync_handlers;
 	const struct mail_index_ext *ext;
 	void *old_data;
 	uint32_t seq;
@@ -769,9 +768,9 @@
 	sync_handlers += ctx->cur_ext_id;
 
 	/* call sync handlers only when we're syncing index (not view) */
-	if (*sync_handlers != NULL && ctx->sync_handlers_initialized) {
-		ret = (*sync_handlers)(ctx, seq, old_data, u + 1,
-				       &ctx->extra_context[ctx->cur_ext_id]);
+	if ((sync_handlers->type & ctx->type) != 0) {
+		ret = sync_handlers->callback(ctx, seq, old_data, u + 1,
+					&ctx->extra_context[ctx->cur_ext_id]);
 		if (ret <= 0)
 			return ret;
 	}
@@ -1009,11 +1008,22 @@
 }
 
 void mail_index_sync_map_init(struct mail_index_sync_map_ctx *sync_map_ctx,
-			      struct mail_index_view *view)
+			      struct mail_index_view *view,
+			      enum mail_index_sync_handler_type type)
 {
 	memset(sync_map_ctx, 0, sizeof(*sync_map_ctx));
 	sync_map_ctx->view = view;
-        sync_map_ctx->cur_ext_id = (uint32_t)-1;
+	sync_map_ctx->cur_ext_id = (uint32_t)-1;
+	sync_map_ctx->type = type;
+
+	mail_index_sync_init_handlers(sync_map_ctx);
+}
+
+void mail_index_sync_map_deinit(struct mail_index_sync_map_ctx *sync_map_ctx)
+{
+	if (sync_map_ctx->expunge_handlers_used)
+		mail_index_sync_deinit_expunge_handlers(sync_map_ctx);
+	mail_index_sync_deinit_handlers(sync_map_ctx);
 }
 
 int mail_index_sync_update_index(struct mail_index_sync_ctx *sync_ctx,
@@ -1031,8 +1041,8 @@
 	uoff_t offset;
 	int ret, had_dirty, skipped, check_ext_offsets;
 
-        mail_index_sync_map_init(&sync_map_ctx, view);
-	mail_index_sync_init_handlers(&sync_map_ctx);
+	mail_index_sync_map_init(&sync_map_ctx, view,
+				 MAIL_INDEX_SYNC_HANDLER_INDEX);
 
 	/* we'll have to update view->lock_id to avoid mail_index_view_lock()
 	   trying to update the file later. */
@@ -1113,10 +1123,7 @@
 		}
 	}
 	map = view->map;
-
-	if (sync_map_ctx.expunge_handlers_used)
-		mail_index_sync_deinit_expunge_handlers(&sync_map_ctx);
-	mail_index_sync_deinit_handlers(&sync_map_ctx);
+        mail_index_sync_map_deinit(&sync_map_ctx);
 
 	if (ret < 0) {
 		mail_index_view_unlock(view);

Index: mail-index-view-sync.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index-view-sync.c,v
retrieving revision 1.27
retrieving revision 1.28
diff -u -d -r1.27 -r1.28
--- mail-index-view-sync.c	6 Nov 2004 17:20:18 -0000	1.27
+++ mail-index-view-sync.c	8 Nov 2004 01:21:14 -0000	1.28
@@ -122,7 +122,8 @@
 	ctx->view = view;
 	ctx->trans_sync_mask = want_mask;
 	ctx->expunges = expunges;
-	mail_index_sync_map_init(&ctx->sync_map_ctx, view);
+	mail_index_sync_map_init(&ctx->sync_map_ctx, view,
+				 MAIL_INDEX_SYNC_HANDLER_VIEW);
 
 	if ((sync_mask & MAIL_INDEX_SYNC_TYPE_EXPUNGE) != 0) {
 		view->new_map = view->index->map;

Index: mail-index.c
===================================================================
RCS file: /var/lib/cvs/dovecot/src/lib-index/mail-index.c,v
retrieving revision 1.162
retrieving revision 1.163
diff -u -d -r1.162 -r1.163
--- mail-index.c	7 Nov 2004 15:15:18 -0000	1.162
+++ mail-index.c	8 Nov 2004 01:21:14 -0000	1.163
@@ -27,7 +27,7 @@
 
 	index->extension_pool = pool_alloconly_create("extension", 256);
 	index->extensions = buffer_create_dynamic(index->extension_pool, 64);
-        index->sync_handlers = buffer_create_dynamic(default_pool, 32);
+        index->sync_handlers = buffer_create_dynamic(default_pool, 64);
         index->expunge_handlers = buffer_create_dynamic(default_pool, 32);
 
 	index->mode = 0600;
@@ -70,7 +70,7 @@
 	ext_count /= sizeof(*extensions);
 
 	i_assert(index->sync_handlers->used /
-		 sizeof(mail_index_sync_handler_t *) == ext_count);
+		 sizeof(struct mail_index_sync_handler) == ext_count);
 
 	/* see if it's already there */
 	for (i = 0; i < ext_count; i++) {
@@ -86,7 +86,7 @@
 
 	buffer_append(index->extensions, &ext, sizeof(ext));
 	buffer_append_zero(index->sync_handlers,
-			   sizeof(mail_index_sync_handler_t *));
+			   sizeof(struct mail_index_sync_handler));
 	return ext_count;
 }
 
@@ -99,10 +99,15 @@
 }
 
 void mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id,
-				      mail_index_sync_handler_t *cb)
+				      mail_index_sync_handler_t *cb,
+				      enum mail_index_sync_handler_type type)
 {
-	buffer_write(index->sync_handlers, ext_id * sizeof(cb),
-		     &cb, sizeof(cb));
+	struct mail_index_sync_handler h;
+
+	memset(&h, 0, sizeof(h));
+	h.callback = cb;
+	h.type = type;
+	buffer_write(index->sync_handlers, ext_id * sizeof(h), &h, sizeof(h));
 }
 
 static void mail_index_map_init_extbufs(struct mail_index_map *map,



More information about the dovecot-cvs mailing list