From 0679f8a70a8dda43b204ae35fc6a903818cc6584 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 3 Jun 2016 22:23:00 +0300 Subject: [PATCH] lib-master: Add automatic data stack frame to init unless disabled. --- src/config/doveconf.c | 6 ++++-- src/lib-master/master-service.c | 10 ++++++++++ src/lib-master/master-service.h | 6 +++++- src/master/main.c | 3 ++- 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/src/config/doveconf.c b/src/config/doveconf.c index a07a289248..63ae419855 100644 --- a/src/config/doveconf.c +++ b/src/config/doveconf.c @@ -701,6 +701,9 @@ static void failure_exit_callback(int *status) int main(int argc, char *argv[]) { + enum master_service_flags master_service_flags = + MASTER_SERVICE_FLAG_STANDALONE | + MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME; enum config_dump_scope scope = CONFIG_DUMP_SCOPE_ALL; const char *orig_config_path, *config_path, *module; ARRAY(const char *) module_names; @@ -720,8 +723,7 @@ int main(int argc, char *argv[]) } memset(&filter, 0, sizeof(filter)); - master_service = master_service_init("config", - MASTER_SERVICE_FLAG_STANDALONE, + master_service = master_service_init("config", master_service_flags, &argc, &argv, "adf:hHm:nNpPexS"); orig_config_path = master_service_get_config_path(master_service); diff --git a/src/lib-master/master-service.c b/src/lib-master/master-service.c index f0e5ffc1b9..f907883bad 100644 --- a/src/lib-master/master-service.c +++ b/src/lib-master/master-service.c @@ -182,6 +182,12 @@ master_service_init(const char *name, enum master_service_flags flags, is properly initialized */ i_set_failure_prefix("%s(init): ", name); + /* make sure all the data stack allocations during init will be freed + before we get to ioloop. the corresponding t_pop() is in + master_service_init_finish(). */ + if ((flags & MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME) == 0) + t_push(NULL); + /* ignore these signals as early as possible */ lib_signals_init(); lib_signals_ignore(SIGPIPE, TRUE); @@ -523,6 +529,10 @@ void master_service_init_finish(struct master_service *service) service->master_status.available_count--; } master_status_update(service); + + /* close data stack frame opened by master_service_init() */ + if ((service->flags & MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME) == 0) + t_pop(); } void master_service_env_clean(void) diff --git a/src/lib-master/master-service.h b/src/lib-master/master-service.h index 21ab957a3e..10e820316c 100644 --- a/src/lib-master/master-service.h +++ b/src/lib-master/master-service.h @@ -32,7 +32,11 @@ enum master_service_flags { listeners (i.e. the service does STARTTLS). */ MASTER_SERVICE_FLAG_USE_SSL_SETTINGS = 0x200, /* Don't initialize SSL context automatically. */ - MASTER_SERVICE_FLAG_NO_SSL_INIT = 0x400 + MASTER_SERVICE_FLAG_NO_SSL_INIT = 0x400, + /* Don't create a data stack frame between master_service_init() and + master_service_init_finish(). By default this is done to make sure + initialization doesn't unnecessarily use up memory in data stack. */ + MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME = 0x800 }; struct master_service_connection { diff --git a/src/master/main.c b/src/master/main.c index 591194cd72..533d4d8056 100644 --- a/src/master/main.c +++ b/src/master/main.c @@ -743,7 +743,8 @@ int main(int argc, char *argv[]) } master_service = master_service_init(MASTER_SERVICE_NAME, MASTER_SERVICE_FLAG_STANDALONE | - MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR, + MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR | + MASTER_SERVICE_FLAG_NO_INIT_DATASTACK_FRAME, &argc, &argv, "+Fanp"); i_unset_failure_prefix(); -- 2.47.3