Mercurial > dovecot > core-2.2
diff src/lib-index/mail-index.c @ 2853:512dd7d76cdc HEAD
Removed cache_offset from mail_index_record and changed it to use extension
instead. Added possibility to register sync and expunge handlers for
extensions. Changed the way extension resets work: all extension updates
which were committed without having seen the reset are ignored.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 06 Nov 2004 19:20:18 +0200 |
parents | 645b8442b519 |
children | b4a46746eb52 |
line wrap: on
line diff
--- a/src/lib-index/mail-index.c Fri Nov 05 17:36:38 2004 +0200 +++ b/src/lib-index/mail-index.c Sat Nov 06 19:20:18 2004 +0200 @@ -27,6 +27,8 @@ 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->expunge_handlers = buffer_create_dynamic(default_pool, 32); index->mode = 0600; index->gid = (gid_t)-1; @@ -38,6 +40,9 @@ mail_index_close(index); pool_unref(index->extension_pool); + buffer_free(index->sync_handlers); + buffer_free(index->expunge_handlers); + i_free(index->error); i_free(index->dir); i_free(index->prefix); @@ -64,6 +69,9 @@ extensions = buffer_get_data(index->extensions, &ext_count); ext_count /= sizeof(*extensions); + i_assert(index->sync_handlers->used / + sizeof(mail_index_sync_handler_t *) == ext_count); + /* see if it's already there */ for (i = 0; i < ext_count; i++) { if (strcmp(extensions[i].name, name) == 0) @@ -77,9 +85,26 @@ ext.record_align = default_record_align; buffer_append(index->extensions, &ext, sizeof(ext)); + buffer_append_zero(index->sync_handlers, + sizeof(mail_index_sync_handler_t *)); return ext_count; } +void mail_index_register_expunge_handler(struct mail_index *index, + uint32_t ext_id, + mail_index_expunge_handler_t *cb) +{ + buffer_write(index->expunge_handlers, ext_id * sizeof(cb), + &cb, sizeof(cb)); +} + +void mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id, + mail_index_sync_handler_t *cb) +{ + buffer_write(index->sync_handlers, ext_id * sizeof(cb), + &cb, sizeof(cb)); +} + static void mail_index_map_init_extbufs(struct mail_index_map *map, unsigned int initial_count) { @@ -125,7 +150,7 @@ struct mail_index_map *map, const char *name, uint32_t hdr_offset, uint32_t hdr_size, uint32_t record_offset, uint32_t record_size, - uint32_t record_align) + uint32_t record_align, uint32_t reset_id) { struct mail_index_ext *ext; uint32_t idx, ext_id; @@ -146,6 +171,7 @@ ext->record_offset = record_offset; ext->record_size = record_size; ext->record_align = record_align; + ext->reset_id = reset_id; ext_id = mail_index_ext_register(index, name, hdr_size, record_size, record_align); @@ -216,7 +242,8 @@ offset, ext_hdr->hdr_size, ext_hdr->record_offset, ext_hdr->record_size, - ext_hdr->record_align); + ext_hdr->record_align, + ext_hdr->reset_id); t_pop(); offset += MAIL_INDEX_HEADER_SIZE_ALIGN(ext_hdr->hdr_size); @@ -577,8 +604,15 @@ ret = mail_index_map_try_existing(index->map); if (ret != 0) return ret; + + if (index->lock_type == F_WRLCK) { + /* we're syncing, don't break the mapping */ + return 1; + } } + i_assert(index->lock_type != F_WRLCK); + if (index->map != NULL && index->map->refcount > 1) { /* this map is already used by some views and they may have pointers into it. leave them and create a new mapping. */