const char *protocol_name;
struct settings_mmap *mmap;
ARRAY_TYPE(settings_override) overrides;
+
+ struct settings_mmap_pool *settings_pools;
};
struct settings_instance {
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)
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);
};
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)
{
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;
}
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 =
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);
}
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);
/* 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);