mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-29 18:19:30 +00:00
chan_dahdi: CLI "core stop gracefully" has needless delay for PRI and SS7.
The PRI and SS7 link control threads are not stopped correctly when the chan_dahdi.so module is unloaded. The link control threads pri_dchannel() and ss7_linkset() are not awakened from a poll() to cancel the thread. * Added a SIGURG signal after requesting the thread cancel to break the link control thread poll() immediately. For SS7 it was slightly worse, the link poll() timeout would always be whatever was the last libss7 scheduled event time used. If no libss7 scheduled event was pending, the thread could run more often than necessary. * Set nextms to 60 seconds for the ss7_linkset() poll() if there is no other libss7 scheduled event. ........ Merged revisions 399818 from http://svn.asterisk.org/svn/asterisk/branches/1.8 ........ Merged revisions 399834 from http://svn.asterisk.org/svn/asterisk/branches/11 ........ Merged revisions 399842 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@399844 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -14120,6 +14120,7 @@ static void pri_destroy_span(struct sig_pri_span *pri)
|
||||
}
|
||||
|
||||
cancel_code = pthread_cancel(master);
|
||||
pthread_kill(master, SIGURG);
|
||||
ast_debug(4,
|
||||
"Waiting to join thread of span %d "
|
||||
"with pid=%p cancel_code=%d\n",
|
||||
@@ -16424,8 +16425,10 @@ static int __unload_module(void)
|
||||
|
||||
#ifdef HAVE_PRI
|
||||
for (i = 0; i < NUM_SPANS; i++) {
|
||||
if (pris[i].pri.master != AST_PTHREADT_NULL)
|
||||
if (pris[i].pri.master != AST_PTHREADT_NULL) {
|
||||
pthread_cancel(pris[i].pri.master);
|
||||
pthread_kill(pris[i].pri.master, SIGURG);
|
||||
}
|
||||
}
|
||||
ast_cli_unregister_multiple(dahdi_pri_cli, ARRAY_LEN(dahdi_pri_cli));
|
||||
ast_unregister_application(dahdi_send_keypad_facility_app);
|
||||
@@ -16435,9 +16438,11 @@ static int __unload_module(void)
|
||||
#endif
|
||||
#if defined(HAVE_SS7)
|
||||
for (i = 0; i < NUM_SPANS; i++) {
|
||||
if (linksets[i].ss7.master != AST_PTHREADT_NULL)
|
||||
if (linksets[i].ss7.master != AST_PTHREADT_NULL) {
|
||||
pthread_cancel(linksets[i].ss7.master);
|
||||
pthread_kill(linksets[i].ss7.master, SIGURG);
|
||||
}
|
||||
}
|
||||
ast_cli_unregister_multiple(dahdi_ss7_cli, ARRAY_LEN(dahdi_ss7_cli));
|
||||
#endif /* defined(HAVE_SS7) */
|
||||
#if defined(HAVE_OPENR2)
|
||||
@@ -16481,8 +16486,9 @@ static int __unload_module(void)
|
||||
|
||||
#if defined(HAVE_PRI)
|
||||
for (i = 0; i < NUM_SPANS; i++) {
|
||||
if (pris[i].pri.master && (pris[i].pri.master != AST_PTHREADT_NULL))
|
||||
if (pris[i].pri.master && (pris[i].pri.master != AST_PTHREADT_NULL)) {
|
||||
pthread_join(pris[i].pri.master, NULL);
|
||||
}
|
||||
for (j = 0; j < SIG_PRI_NUM_DCHANS; j++) {
|
||||
dahdi_close_pri_fd(&(pris[i]), j);
|
||||
}
|
||||
@@ -16497,8 +16503,9 @@ static int __unload_module(void)
|
||||
|
||||
#if defined(HAVE_SS7)
|
||||
for (i = 0; i < NUM_SPANS; i++) {
|
||||
if (linksets[i].ss7.master && (linksets[i].ss7.master != AST_PTHREADT_NULL))
|
||||
if (linksets[i].ss7.master && (linksets[i].ss7.master != AST_PTHREADT_NULL)) {
|
||||
pthread_join(linksets[i].ss7.master, NULL);
|
||||
}
|
||||
for (j = 0; j < SIG_SS7_NUM_DCHANS; j++) {
|
||||
dahdi_close_ss7_fd(&(linksets[i]), j);
|
||||
}
|
||||
|
@@ -788,7 +788,9 @@ void *ss7_linkset(void *data)
|
||||
ss7_event *e = NULL;
|
||||
struct sig_ss7_chan *p;
|
||||
struct pollfd pollers[SIG_SS7_NUM_DCHANS];
|
||||
int nextms = 0;
|
||||
int nextms;
|
||||
|
||||
#define SS7_MAX_POLL 60000 /* Maximum poll time in ms. */
|
||||
|
||||
pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, NULL);
|
||||
|
||||
@@ -813,6 +815,11 @@ void *ss7_linkset(void *data)
|
||||
}
|
||||
nextms = tv.tv_sec * 1000;
|
||||
nextms += tv.tv_usec / 1000;
|
||||
if (SS7_MAX_POLL < nextms) {
|
||||
nextms = SS7_MAX_POLL;
|
||||
}
|
||||
} else {
|
||||
nextms = SS7_MAX_POLL;
|
||||
}
|
||||
|
||||
for (i = 0; i < linkset->numsigchans; i++) {
|
||||
|
Reference in New Issue
Block a user