diff --git a/main/cdr.c b/main/cdr.c index 84ba84104e..bd56d8291a 100644 --- a/main/cdr.c +++ b/main/cdr.c @@ -1531,7 +1531,7 @@ static char *handle_cli_submit(struct ast_cli_entry *e, int cmd, struct ast_cli_ static struct ast_cli_entry cli_submit = AST_CLI_DEFINE(handle_cli_submit, "Posts all pending batched CDR data"); static struct ast_cli_entry cli_status = AST_CLI_DEFINE(handle_cli_status, "Display the CDR status"); -static int do_reload(int reload) +static void do_reload(int reload) { struct ast_config *config; struct ast_variable *v; @@ -1539,11 +1539,10 @@ static int do_reload(int reload) int cfg_time; int was_enabled; int was_batchmode; - int res = 0; struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 }; if ((config = ast_config_load2("cdr.conf", "cdr", config_flags)) == CONFIG_STATUS_FILEUNCHANGED) { - return 0; + return; } ast_mutex_lock(&cdr_batch_lock); @@ -1562,7 +1561,7 @@ static int do_reload(int reload) if (config == CONFIG_STATUS_FILEMISSING || config == CONFIG_STATUS_FILEINVALID) { ast_mutex_unlock(&cdr_batch_lock); - return 0; + return; } /* don't run the next scheduled CDR posting while reloading */ @@ -1623,7 +1622,6 @@ static int do_reload(int reload) } else { ast_cli_register(&cli_submit); ast_register_atexit(ast_cdr_engine_term); - res = 0; } /* if this reload disabled the CDR and/or batch mode and there is a background thread, kill it */ @@ -1636,27 +1634,39 @@ static int do_reload(int reload) ast_cond_destroy(&cdr_pending_cond); ast_cli_unregister(&cli_submit); ast_unregister_atexit(ast_cdr_engine_term); - res = 0; /* if leaving batch mode, then post the CDRs in the batch, and don't reschedule, since we are stopping CDR logging */ if (!batchmode && was_batchmode) { ast_cdr_engine_term(); } - } else { - res = 0; } ast_mutex_unlock(&cdr_batch_lock); ast_config_destroy(config); manager_event(EVENT_FLAG_SYSTEM, "Reload", "Module: CDR\r\nMessage: CDR subsystem reload requested\r\n"); +} - return res; +static void cdr_engine_shutdown(void) +{ + if (cdr_thread != AST_PTHREADT_NULL) { + /* wake up the thread so it will exit */ + pthread_cancel(cdr_thread); + pthread_kill(cdr_thread, SIGURG); + pthread_join(cdr_thread, NULL); + cdr_thread = AST_PTHREADT_NULL; + ast_cond_destroy(&cdr_pending_cond); + } + ast_cli_unregister(&cli_submit); + + ast_cli_unregister(&cli_status); + ast_sched_context_destroy(sched); + sched = NULL; + ast_free(batch); + batch = NULL; } int ast_cdr_engine_init(void) { - int res; - sched = ast_sched_context_create(); if (!sched) { ast_log(LOG_ERROR, "Unable to create schedule context.\n"); @@ -1664,15 +1674,10 @@ int ast_cdr_engine_init(void) } ast_cli_register(&cli_status); + do_reload(0); + ast_register_atexit(cdr_engine_shutdown); - res = do_reload(0); - if (res) { - ast_mutex_lock(&cdr_batch_lock); - res = init_batch(); - ast_mutex_unlock(&cdr_batch_lock); - } - - return res; + return 0; } /* \note This actually gets called a couple of times at shutdown. Once, before we start @@ -1684,7 +1689,8 @@ void ast_cdr_engine_term(void) int ast_cdr_engine_reload(void) { - return do_reload(1); + do_reload(1); + return 0; } int ast_cdr_data_add_structure(struct ast_data *tree, struct ast_cdr *cdr, int recur)