From: Timo Sirainen Date: Mon, 17 Apr 2023 22:39:45 +0000 (+0300) Subject: lib-master: Move master_service.settings_pools tracking to settings_root X-Git-Tag: 2.4.0~2154 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=615be62a8c3ca9263dbda09ff1600be4acaad0b4;p=thirdparty%2Fdovecot%2Fcore.git lib-master: Move master_service.settings_pools tracking to settings_root --- diff --git a/src/lib-master/master-service-private.h b/src/lib-master/master-service-private.h index 2ea16b86c7..5e50046869 100644 --- a/src/lib-master/master-service-private.h +++ b/src/lib-master/master-service-private.h @@ -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; diff --git a/src/lib-master/master-service-settings.c b/src/lib-master/master-service-settings.c index 094d5ed3d5..9ea308e1c7 100644 --- a/src/lib-master/master-service-settings.c +++ b/src/lib-master/master-service-settings.c @@ -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); } diff --git a/src/lib-master/master-service-settings.h b/src/lib-master/master-service-settings.h index fbb87faedc..20f3ba8b9e 100644 --- a/src/lib-master/master-service-settings.h +++ b/src/lib-master/master-service-settings.h @@ -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 diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index c012445f60..adf2201cc9 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -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);