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;
}
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);
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);
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)
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 {
}
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();