]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-master: Move master_service.settings_pools tracking to settings_root
authorTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 17 Apr 2023 22:39:45 +0000 (01:39 +0300)
committerTimo Sirainen <timo.sirainen@open-xchange.com>
Mon, 20 Nov 2023 12:21:55 +0000 (14:21 +0200)
src/lib-master/master-service-private.h
src/lib-master/master-service-settings.c
src/lib-master/master-service-settings.h
src/lib-master/master-service.c

index 2ea16b86c732ed0a1a333d332900e3a3a097e1e5..5e500468693f59b0ec3e3939248d20518ed74b14 100644 (file)
@@ -74,7 +74,6 @@ struct master_service {
        master_service_connection_callback_t *callback;
 
        const struct master_service_settings *set;
-       struct settings_mmap_pool *settings_pools;
 
        struct ssl_iostream_context *ssl_ctx;
        time_t ssl_params_last_refresh;
index 094d5ed3d5f2bddc7a0fbd592a928e846001b77d..9ea308e1c77a3df1fe3f73ddf9d558960f038448 100644 (file)
@@ -70,6 +70,8 @@ struct settings_root {
        const char *protocol_name;
        struct settings_mmap *mmap;
        ARRAY_TYPE(settings_override) overrides;
+
+       struct settings_mmap_pool *settings_pools;
 };
 
 struct settings_instance {
@@ -975,7 +977,8 @@ struct settings_mmap_pool {
 
        pool_t extra_pool_ref;
        pool_t parent_pool;
-       struct settings_mmap *mmap;
+       struct settings_mmap *mmap; /* NULL for unit tests */
+       struct settings_root *root;
 };
 
 static const char *settings_mmap_pool_get_name(pool_t pool)
@@ -1005,7 +1008,7 @@ static void settings_mmap_pool_unref(pool_t *pool)
        if (--mpool->refcount > 0)
                return;
 
-       DLLIST_REMOVE(&master_service->settings_pools, mpool);
+       DLLIST_REMOVE(&mpool->root->settings_pools, mpool);
 
        settings_mmap_unref(&mpool->mmap);
        pool_unref(&mpool->extra_pool_ref);
@@ -1066,7 +1069,8 @@ static struct pool_vfuncs static_settings_mmap_pool_vfuncs = {
 };
 
 static struct settings_mmap_pool *
-settings_mmap_pool_create(struct settings_mmap *mmap,
+settings_mmap_pool_create(struct settings_root *root,
+                         struct settings_mmap *mmap,
                          const char *source_filename,
                          unsigned int source_linenum)
 {
@@ -1079,13 +1083,14 @@ settings_mmap_pool_create(struct settings_mmap *mmap,
        mpool->pool.alloconly_pool = TRUE;
        mpool->refcount = 1;
        mpool->parent_pool = parent_pool;
+       mpool->root = root;
        mpool->mmap = mmap;
        mpool->source_filename = source_filename;
        mpool->source_linenum = source_linenum;
        if (mmap != NULL)
                settings_mmap_ref(mmap);
 
-       DLLIST_PREPEND(&master_service->settings_pools, mpool);
+       DLLIST_PREPEND(&root->settings_pools, mpool);
        return mpool;
 }
 
@@ -1240,7 +1245,7 @@ settings_instance_get(struct event *event,
                event_add_str(event, "protocol", root->protocol_name);
 
        struct settings_mmap_pool *mpool =
-               settings_mmap_pool_create(instance->mmap,
+               settings_mmap_pool_create(root, instance->mmap,
                                          source_filename, source_linenum);
        pool_t set_pool = &mpool->pool;
        struct setting_parser_context *parser =
@@ -1460,19 +1465,15 @@ struct settings_root *settings_root_init(void)
 void settings_root_deinit(struct settings_root **_root)
 {
        struct settings_root *root = *_root;
+       struct settings_mmap_pool *mpool;
 
        *_root = NULL;
 
        settings_mmap_unref(&root->mmap);
-       pool_unref(&root->pool);
-}
 
-void master_service_settings_deinit(struct master_service *service)
-{
-       struct settings_mmap_pool *mpool;
-
-       for (mpool = service->settings_pools; mpool != NULL; mpool = mpool->next) {
-               e_warning(service->event, "Leaked settings: %s:%u",
+       for (mpool = root->settings_pools; mpool != NULL; mpool = mpool->next) {
+               i_warning("Leaked settings: %s:%u",
                          mpool->source_filename, mpool->source_linenum);
        }
+       pool_unref(&root->pool);
 }
index fbb87faedce67e3507671047b8bd16f4e3d8e603..20f3ba8b9e425cdf4c497ea95c63621270eba0cc 100644 (file)
@@ -211,6 +211,4 @@ void settings_instance_free(struct settings_instance **instance);
 struct settings_root *settings_root_init(void);
 void settings_root_deinit(struct settings_root **root);
 
-void master_service_settings_deinit(struct master_service *service);
-
 #endif
index c012445f60e45e7443000525d1bb00316a33139a..adf2201cc94703d3a0dbbd52149f5a8013c47e93 100644 (file)
@@ -1591,7 +1591,6 @@ static void master_service_deinit_real(struct master_service *service)
                array_free(&service->config_overrides);
 
        settings_free(service->set);
-       settings_root_deinit(&service->settings_root);
        i_free(master_service_category_name);
        master_service_category.name = NULL;
        event_unregister_callback(master_service_event_callback);
@@ -1610,7 +1609,7 @@ static void master_service_free(struct master_service **_service)
 
        /* Check for leaks only after lib_atexit() callbacks have been called,
           since they may also free settings. */
-       master_service_settings_deinit(service);
+       settings_root_deinit(&service->settings_root);
 
        for (i = 0; i < service->socket_count; i++) {
                i_free(service->listeners[i].name);