/* 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; }
static void main_loop_exit_finish(void) { /* deinit the current configuration, as at this point we _know_ that no * threads are running. This will unregister ivykis tasks and timers * that could fire while the configuration is being destructed */ cfg_deinit(current_configuration); iv_quit(); }
static void _deinit(void) { cfg_deinit(configuration); cfg_free(configuration); }