]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
chan_dahdi: CLI "core stop gracefully" has needless delay for PRI and SS7.
authorRichard Mudgett <rmudgett@digium.com>
Wed, 25 Sep 2013 20:23:07 +0000 (20:23 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 25 Sep 2013 20:23:07 +0000 (20:23 +0000)
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.

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.8@399818 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c
channels/sig_ss7.c

index 4112559e33820c782e4b662838b571e45737f526..d518f3b47bc89505d3be7d58f92f84770e00774a 100644 (file)
@@ -16722,8 +16722,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);
@@ -16733,9 +16735,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)
@@ -16776,8 +16780,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);
                }
@@ -16792,8 +16797,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);
                }
index 3a25babf1f11a5a57d63e5c65eb649a0f3e70d4e..8d501568abd4d763dc5f0af006d7c1574610d06b 100644 (file)
@@ -714,7 +714,9 @@ void *ss7_linkset(void *data)
        struct sig_ss7_chan *p;
        int chanpos;
        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);
 
@@ -739,6 +741,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++) {