summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--channels/chan_dahdi.c15
-rw-r--r--channels/sig_ss7.c9
2 files changed, 19 insertions, 5 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c
index 957ad6fed..5fc968367 100644
--- a/channels/chan_dahdi.c
+++ b/channels/chan_dahdi.c
@@ -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);
}
diff --git a/channels/sig_ss7.c b/channels/sig_ss7.c
index baf152d4e..e6e11bed6 100644
--- a/channels/sig_ss7.c
+++ b/channels/sig_ss7.c
@@ -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++) {