From: Timo Sirainen Date: Sun, 19 Feb 2017 00:02:20 +0000 (+0200) Subject: lib-storage: mail_storage_init/deinit() is now reference counted. X-Git-Tag: 2.3.0.rc1~2067 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=073353fe5b7ddbc44fd2b099e023b84254041083;p=thirdparty%2Fdovecot%2Fcore.git lib-storage: mail_storage_init/deinit() is now reference counted. This allows calling them multiple times and only the final deinit frees the data. --- diff --git a/src/lib-storage/mail-storage-service.c b/src/lib-storage/mail-storage-service.c index 857224d754..601f22fed5 100644 --- a/src/lib-storage/mail-storage-service.c +++ b/src/lib-storage/mail-storage-service.c @@ -911,8 +911,6 @@ mail_storage_service_init(struct master_service *service, mail_storage_service_time_moved); mail_storage_init(); - mail_storage_register_all(); - mailbox_list_register_all(); pool = pool_alloconly_create("mail storage service", 2048); ctx = p_new(pool, struct mail_storage_service_ctx, 1); diff --git a/src/lib-storage/mail-storage.c b/src/lib-storage/mail-storage.c index c61abbe2b9..ecbcf0847a 100644 --- a/src/lib-storage/mail-storage.c +++ b/src/lib-storage/mail-storage.c @@ -43,17 +43,26 @@ struct mail_storage_mail_index_module mail_storage_mail_index_module = MODULE_CONTEXT_INIT(&mail_index_module_register); ARRAY_TYPE(mail_storage) mail_storage_classes; +static int mail_storage_init_refcount = 0; + void mail_storage_init(void) { + if (mail_storage_init_refcount++ > 0) + return; dsasl_clients_init(); mailbox_attributes_init(); mailbox_lists_init(); mail_storage_hooks_init(); i_array_init(&mail_storage_classes, 8); + mail_storage_register_all(); + mailbox_list_register_all(); } void mail_storage_deinit(void) { + i_assert(mail_storage_init_refcount > 0); + if (--mail_storage_init_refcount > 0) + return; if (mail_search_register_human != NULL) mail_search_register_deinit(&mail_search_register_human); if (mail_search_register_imap != NULL)