Mercurial > dovecot > original-hg > dovecot-1.2
changeset 3224:f6e0d1826645 HEAD
Added sync/sync_lost/expunge handler unregistering, and also do that. Fixes
crash with mmap_disable=yes when reopening mailbox.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 25 Mar 2005 00:12:12 +0200 |
parents | f3c1a9a32a8e |
children | 43d862951f90 |
files | src/lib-index/mail-cache.c src/lib-index/mail-index-private.h src/lib-index/mail-index.c |
diffstat | 3 files changed, 58 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-index/mail-cache.c Thu Mar 24 23:00:10 2005 +0200 +++ b/src/lib-index/mail-cache.c Fri Mar 25 00:12:12 2005 +0200 @@ -307,10 +307,16 @@ void mail_cache_free(struct mail_cache *cache) { if (cache->file_cache != NULL) { + mail_index_unregister_sync_lost_handler(cache->index, + mail_cache_sync_lost_handler); + file_cache_free(cache->file_cache); cache->file_cache = NULL; } + mail_index_unregister_expunge_handler(cache->index, cache->ext_id); + mail_index_unregister_sync_handler(cache->index, cache->ext_id); + mail_cache_file_close(cache); hash_destroy(cache->field_name_hash);
--- a/src/lib-index/mail-index-private.h Thu Mar 24 23:00:10 2005 +0200 +++ b/src/lib-index/mail-index-private.h Fri Mar 25 00:12:12 2005 +0200 @@ -173,11 +173,17 @@ void mail_index_register_expunge_handler(struct mail_index *index, uint32_t ext_id, mail_index_expunge_handler_t *cb); +void mail_index_unregister_expunge_handler(struct mail_index *index, + uint32_t ext_id); void mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id, mail_index_sync_handler_t *cb, enum mail_index_sync_handler_type type); +void mail_index_unregister_sync_handler(struct mail_index *index, + uint32_t ext_id); void mail_index_register_sync_lost_handler(struct mail_index *index, mail_index_sync_lost_handler_t *cb); +void mail_index_unregister_sync_lost_handler(struct mail_index *index, + mail_index_sync_lost_handler_t *cb); int mail_index_write_base_header(struct mail_index *index, const struct mail_index_header *hdr);
--- a/src/lib-index/mail-index.c Thu Mar 24 23:00:10 2005 +0200 +++ b/src/lib-index/mail-index.c Fri Mar 25 00:12:12 2005 +0200 @@ -108,7 +108,23 @@ uint32_t ext_id, mail_index_expunge_handler_t *cb) { - array_idx_set(&index->expunge_handlers, ext_id, &cb); + mail_index_expunge_handler_t **p; + + p = array_modifyable_idx(&index->expunge_handlers, ext_id); + i_assert(*p == NULL); + + *p = cb; +} + +void mail_index_unregister_expunge_handler(struct mail_index *index, + uint32_t ext_id) +{ + mail_index_expunge_handler_t **p; + + p = array_modifyable_idx(&index->expunge_handlers, ext_id); + i_assert(*p != NULL); + + *p = NULL; } void mail_index_register_sync_handler(struct mail_index *index, uint32_t ext_id, @@ -118,16 +134,45 @@ struct mail_index_sync_handler *h; h = array_modifyable_idx(&index->sync_handlers, ext_id); + i_assert(h->callback == NULL); + h->callback = cb; h->type = type; } +void mail_index_unregister_sync_handler(struct mail_index *index, + uint32_t ext_id) +{ + struct mail_index_sync_handler *h; + + h = array_modifyable_idx(&index->sync_handlers, ext_id); + i_assert(h->callback != NULL); + + h->callback = NULL; + h->type = 0; +} + void mail_index_register_sync_lost_handler(struct mail_index *index, mail_index_sync_lost_handler_t *cb) { array_append(&index->sync_lost_handlers, &cb, 1); } +void mail_index_unregister_sync_lost_handler(struct mail_index *index, + mail_index_sync_lost_handler_t *cb) +{ + mail_index_sync_lost_handler_t *const *handlers; + unsigned int i, count; + + handlers = array_get(&index->sync_lost_handlers, &count); + for (i = 0; i < count; i++) { + if (handlers[i] == cb) { + array_delete(&index->sync_lost_handlers, i, 1); + break; + } + } +} + static void mail_index_map_init_extbufs(struct mail_index_map *map, unsigned int initial_count) {