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


git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@415464 65c4cc65-6c06-0410-ace0-fbb531ad65f3
changes/61/61/1
Corey Farrell 11 years ago
parent a92d272d2f
commit 2173e79720

@ -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;
@ -177,6 +178,7 @@ static void *autoservice_run(void *ign)
}
}
ast_callid_threadassoc_change(NULL);
asthread = AST_PTHREADT_NULL;
return NULL;
@ -337,7 +339,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);
}

Loading…
Cancel
Save