/* called to apply the new configuration once all I/O worker threads have finished */ static void main_loop_reload_config_apply(void) { if (main_loop_is_terminating()) { if (main_loop_new_config) { cfg_free(main_loop_new_config); main_loop_new_config = NULL; } return; } main_loop_old_config->persist = persist_config_new(); cfg_deinit(main_loop_old_config); cfg_persist_config_move(main_loop_old_config, main_loop_new_config); if (cfg_init(main_loop_new_config)) { msg_verbose("New configuration initialized"); persist_config_free(main_loop_new_config->persist); main_loop_new_config->persist = NULL; cfg_free(main_loop_old_config); current_configuration = main_loop_new_config; service_management_clear_status(); } else { msg_error("Error initializing new configuration, reverting to old config"); service_management_publish_status("Error initializing new configuration, using the old config"); cfg_persist_config_move(main_loop_new_config, main_loop_old_config); cfg_deinit(main_loop_new_config); if (!cfg_init(main_loop_old_config)) { /* hmm. hmmm, error reinitializing old configuration, we're hosed. * Best is to kill ourselves in the hope that the supervisor * restarts us. */ kill(getpid(), SIGQUIT); g_assert_not_reached(); } persist_config_free(main_loop_old_config->persist); main_loop_old_config->persist = NULL; cfg_free(main_loop_new_config); current_configuration = main_loop_old_config; goto finish; } /* this is already running with the new config in place */ app_post_config_loaded(); msg_notice("Configuration reload request received, reloading configuration"); finish: main_loop_new_config = NULL; main_loop_old_config = NULL; return; }
void cfg_persist_config_move(GlobalConfig *src, GlobalConfig *dest) { if (dest->persist != NULL) persist_config_free(dest->persist); dest->persist = src->persist; dest->state = src->state; src->persist = NULL; src->state = NULL; }
static void _teardown(void) { _free_test(); if (test_cfg->persist) { persist_config_free(test_cfg->persist); test_cfg->persist = NULL; } cfg_free(test_cfg); log_msg_registry_deinit(); msg_deinit(); }