diff options
author | Corey Farrell <git@cfware.com> | 2014-06-09 03:50:45 +0000 |
---|---|---|
committer | Corey Farrell <git@cfware.com> | 2014-06-09 03:50:45 +0000 |
commit | 8da7f0248f2ade26f14e5ce3986412a39de6f960 (patch) | |
tree | 2a007f0e2518ee811d2e3c2d9b450bbc4d97f535 | |
parent | 20a14e568f64de25326d794768790351cb703330 (diff) |
autoservice: stop thread on graceful shutdown
This change adds thread shutdown to autoservice for graceful shutdowns only.
ast_register_cleanup is backported to 1.8 to allow this. The logger callid
is also released on shutdown in 11+.
ASTERISK-23827 #close
Reported by: Corey Farrell
Review: https://reviewboard.asterisk.org/r/3594/
........
Merged revisions 415463 from http://svn.asterisk.org/svn/asterisk/branches/1.8
........
Merged revisions 415464 from http://svn.asterisk.org/svn/asterisk/branches/11
........
Merged revisions 415465 from http://svn.asterisk.org/svn/asterisk/branches/12
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@415466 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | main/autoservice.c | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/main/autoservice.c b/main/autoservice.c index 5293cbab4..305ab23b1 100644 --- a/main/autoservice.c +++ b/main/autoservice.c @@ -72,6 +72,7 @@ static AST_LIST_HEAD_STATIC(aslist, asent); static ast_cond_t as_cond; static pthread_t asthread = AST_PTHREADT_NULL; +static volatile int asexit = 0; static int as_chan_list_state; @@ -83,7 +84,7 @@ static void *autoservice_run(void *ign) .subclass.integer = AST_CONTROL_HANGUP, }; - for (;;) { + while (!asexit) { struct ast_channel *mons[MAX_AUTOMONS]; struct asent *ents[MAX_AUTOMONS]; struct ast_channel *chan; @@ -183,6 +184,7 @@ static void *autoservice_run(void *ign) * If we did, we'd need to ast_frfree(f) if (f). */ } + ast_callid_threadassoc_change(NULL); asthread = AST_PTHREADT_NULL; return NULL; @@ -343,7 +345,19 @@ int ast_autoservice_ignore(struct ast_channel *chan, enum ast_frame_type ftype) return res; } +static void autoservice_shutdown(void) +{ + pthread_t th = asthread; + asexit = 1; + if (th != AST_PTHREADT_NULL) { + ast_cond_signal(&as_cond); + pthread_kill(th, SIGURG); + pthread_join(th, NULL); + } +} + void ast_autoservice_init(void) { + ast_register_cleanup(autoservice_shutdown); ast_cond_init(&as_cond, NULL); } |