]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: mail_storage_init/deinit() is now reference counted.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Sun, 19 Feb 2017 00:02:20 +0000 (02:02 +0200)
committerGitLab <gitlab@git.dovecot.net>
Sun, 19 Feb 2017 14:11:14 +0000 (16:11 +0200)
This allows calling them multiple times and only the final deinit frees the
data.

src/lib-storage/mail-storage-service.c
src/lib-storage/mail-storage.c

index 857224d7541f15749157a1c630fba79f3481badb..601f22fed55da7c750bfc724bab1f91a3013908d 100644 (file)
@@ -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);
index c61abbe2b9e7453e12fb5ec927a199bf0cb70c23..ecbcf0847a70cb3433f1040b6a8c2b18435c2852 100644 (file)
@@ -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)