Cleanup CDR resources on exit.

* Simplify do_reload() return handling since it never returned anything
other than 0.

(issue ASTERISK-20649)
Reported by: Corey Farrell
Patches:
      cdr-cleanup-1_8.patch (license #5909) patch uploaded by Corey Farrell
      cdr-cleanup-10-11-trunk.patch (license #5909) patch uploaded by Corey Farrell
      Modified
........

Merged revisions 377069 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........

Merged revisions 377070 from http://svn.asterisk.org/svn/asterisk/branches/10
........

Merged revisions 377071 from http://svn.asterisk.org/svn/asterisk/branches/11


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@377072 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Richard Mudgett 2012-12-03 18:45:18 +00:00
parent a36f73447d
commit b59c27000a
1 changed files with 26 additions and 20 deletions

View File

@ -1542,7 +1542,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;
@ -1550,11 +1550,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);
@ -1573,7 +1572,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 */
@ -1634,7 +1633,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 */
@ -1647,27 +1645,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");
@ -1675,15 +1685,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
@ -1695,7 +1700,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)