Mercurial > dovecot > original-hg > dovecot-1.2
changeset 2869:d2daf90c79f1 HEAD
Cache invalidating needed to hook into view syncing as well.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 08 Nov 2004 03:21:14 +0200 |
parents | 316756b50150 |
children | 2f00acfc6bc2 |
files | src/lib-index/mail-cache-sync-update.c src/lib-index/mail-cache.c src/lib-index/mail-index-private.h src/lib-index/mail-index-sync-private.h src/lib-index/mail-index-sync-update.c src/lib-index/mail-index-view-sync.c src/lib-index/mail-index.c |
diffstat | 7 files changed, 58 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-cache-sync-update.c Mon Nov 08 03:02:52 2004 +0200 +++ b/src/lib-index/mail-cache-sync-update.c Mon Nov 08 03:21:14 2004 +0200 @@ -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 */
--- a/src/lib-index/mail-cache.c Mon Nov 08 03:02:52 2004 +0200 +++ b/src/lib-index/mail-cache.c Mon Nov 08 03:21:14 2004 +0200 @@ -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; }
--- a/src/lib-index/mail-index-private.h Mon Nov 08 03:02:52 2004 +0200 +++ b/src/lib-index/mail-index-private.h Mon Nov 08 03:21:14 2004 +0200 @@ -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);
--- a/src/lib-index/mail-index-sync-private.h Mon Nov 08 03:02:52 2004 +0200 +++ b/src/lib-index/mail-index-sync-private.h Mon Nov 08 03:21:14 2004 +0200 @@ -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);
--- a/src/lib-index/mail-index-sync-update.c Mon Nov 08 03:02:52 2004 +0200 +++ b/src/lib-index/mail-index-sync-update.c Mon Nov 08 03:21:14 2004 +0200 @@ -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);
--- a/src/lib-index/mail-index-view-sync.c Mon Nov 08 03:02:52 2004 +0200 +++ b/src/lib-index/mail-index-view-sync.c Mon Nov 08 03:21:14 2004 +0200 @@ -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;
--- a/src/lib-index/mail-index.c Mon Nov 08 03:02:52 2004 +0200 +++ b/src/lib-index/mail-index.c Mon Nov 08 03:21:14 2004 +0200 @@ -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,