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)
 {