summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorAutomerge script <automerge@asterisk.org>2012-12-03 19:19:39 +0000
committerAutomerge script <automerge@asterisk.org>2012-12-03 19:19:39 +0000
commit1ba058bb7d1eac129e95921b8600b5127e011055 (patch)
treef4536d2ada367dfc7f13e6b36cd2cfbabcd5fce9 /main
parent66fe664c007253748a23d48f4acc00a05a8d4b84 (diff)
Merged revisions 377072,377077 via svnmerge from
file:///srv/subversion/repos/asterisk/trunk ................ r377072 | rmudgett | 2012-12-03 12:45:18 -0600 (Mon, 03 Dec 2012) | 21 lines 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 ................ r377077 | rmudgett | 2012-12-03 13:17:24 -0600 (Mon, 03 Dec 2012) | 18 lines Cleanup CLI resources on exit and CLI command registration errors. (issue ASTERISK-20649) Reported by: Corey Farrell Patches: cli-leaks-1_8-10.patch (license #5909) patch uploaded by Corey Farrell cli-leaks-11-trunk.patch (license #5909) patch uploaded by Corey Farrell Modified ........ Merged revisions 377073 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 377074 from http://svn.asterisk.org/svn/asterisk/branches/10 ........ Merged revisions 377075 from http://svn.asterisk.org/svn/asterisk/branches/11 ................ git-svn-id: https://origsvn.digium.com/svn/asterisk/team/mmichelson/threadpool@377083 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main')
-rw-r--r--main/cdr.c46
-rw-r--r--main/cli.c41
2 files changed, 63 insertions, 24 deletions
diff --git a/main/cdr.c b/main/cdr.c
index 416895de5..24849001c 100644
--- a/main/cdr.c
+++ b/main/cdr.c
@@ -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)
diff --git a/main/cli.c b/main/cli.c
index fc307b164..818ce757f 100644
--- a/main/cli.c
+++ b/main/cli.c
@@ -1897,10 +1897,16 @@ int ast_cli_perms_init(int reload)
return 0;
}
+static void cli_shutdown(void)
+{
+ ast_cli_unregister_multiple(cli_cli, ARRAY_LEN(cli_cli));
+}
+
/*! \brief initialize the _full_cmd string in * each of the builtins. */
void ast_builtins_init(void)
{
ast_cli_register_multiple(cli_cli, ARRAY_LEN(cli_cli));
+ ast_register_atexit(cli_shutdown);
}
/*!
@@ -2065,6 +2071,18 @@ static char *find_best(const char *argv[])
return cmdline;
}
+static int cli_is_registered(struct ast_cli_entry *e)
+{
+ struct ast_cli_entry *cur = NULL;
+
+ while ((cur = cli_next(cur))) {
+ if (cur == e) {
+ return 1;
+ }
+ }
+ return 0;
+}
+
static int __ast_cli_unregister(struct ast_cli_entry *e, struct ast_cli_entry *ed)
{
if (e->inuse) {
@@ -2096,6 +2114,15 @@ static int __ast_cli_register(struct ast_cli_entry *e, struct ast_cli_entry *ed)
char **dst = (char **)e->cmda; /* need to cast as the entry is readonly */
char *s;
+ AST_RWLIST_WRLOCK(&helpers);
+
+ if (cli_is_registered(e)) {
+ ast_log(LOG_WARNING, "Command '%s' already registered (the same ast_cli_entry)\n",
+ S_OR(e->_full_cmd, e->command));
+ ret = 0; /* report success */
+ goto done;
+ }
+
memset(&a, '\0', sizeof(a));
e->handler(e, CLI_INIT, &a);
/* XXX check that usage and command are filled up */
@@ -2111,14 +2138,16 @@ static int __ast_cli_register(struct ast_cli_entry *e, struct ast_cli_entry *ed)
}
*dst++ = NULL;
- AST_RWLIST_WRLOCK(&helpers);
-
if (find_cli(e->cmda, 1)) {
- ast_log(LOG_WARNING, "Command '%s' already registered (or something close enough)\n", S_OR(e->_full_cmd, e->command));
+ ast_log(LOG_WARNING, "Command '%s' already registered (or something close enough)\n",
+ S_OR(e->_full_cmd, e->command));
goto done;
}
- if (set_full_cmd(e))
+ if (set_full_cmd(e)) {
+ ast_log(LOG_WARNING, "Error registering CLI Command '%s'\n",
+ S_OR(e->_full_cmd, e->command));
goto done;
+ }
lf = e->cmdlen;
AST_RWLIST_TRAVERSE_SAFE_BEGIN(&helpers, cur, list) {
@@ -2138,6 +2167,10 @@ static int __ast_cli_register(struct ast_cli_entry *e, struct ast_cli_entry *ed)
done:
AST_RWLIST_UNLOCK(&helpers);
+ if (ret) {
+ ast_free(e->command);
+ e->command = NULL;
+ }
return ret;
}