Remove some useless locking and make sure we hangup channels on a link when we get...
authorMatthew Fredrickson <creslin@digium.com>
Fri, 14 Nov 2008 16:34:33 +0000 (16:34 +0000)
committerMatthew Fredrickson <creslin@digium.com>
Fri, 14 Nov 2008 16:34:33 +0000 (16:34 +0000)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@156874 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_dahdi.c

index c975a1e..4dcea78 100644 (file)
@@ -9422,6 +9422,20 @@ static void ss7_handle_cqm(struct dahdi_ss7 *linkset, int startcic, int endcic,
        
 }
 
+static inline void ss7_hangup_cics(struct dahdi_ss7 *linkset, int startcic, int endcic, unsigned int dpc)
+{
+       int i;
+
+       for (i = 0; i < linkset->numchans; i++) {
+               if (linkset->pvts[i] && (linkset->pvts[i]->dpc == dpc && ((linkset->pvts[i]->cic >= startcic) && (linkset->pvts[i]->cic <= endcic)))) {
+                       ast_mutex_lock(&linkset->pvts[i]->lock);
+                       if (linkset->pvts[i]->owner)
+                               linkset->pvts[i]->owner->_softhangup |= AST_SOFTHANGUP_DEV;
+                       ast_mutex_unlock(&linkset->pvts[i]->lock);
+               }
+       }
+}
+
 static inline void ss7_block_cics(struct dahdi_ss7 *linkset, int startcic, int endcic, unsigned int dpc, unsigned char state[], int block)
 {
        int i;
@@ -9715,15 +9729,11 @@ static void *ss7_linkset(void *data)
                        }
 
                        if (pollers[i].revents & POLLIN) {
-                               ast_mutex_lock(&linkset->lock);
                                res = ss7_read(ss7, pollers[i].fd);
-                               ast_mutex_unlock(&linkset->lock);
                        }
 
                        if (pollers[i].revents & POLLOUT) {
-                               ast_mutex_lock(&linkset->lock);
                                res = ss7_write(ss7, pollers[i].fd);
-                               ast_mutex_unlock(&linkset->lock);
                                if (res < 0) {
                                        ast_debug(1, "Error in write %s\n", strerror(errno));
                                }
@@ -9816,6 +9826,7 @@ static void *ss7_linkset(void *data)
                                p = linkset->pvts[chanpos];
                                isup_gra(ss7, e->grs.startcic, e->grs.endcic, e->grs.opc);
                                ss7_block_cics(linkset, e->grs.startcic, e->grs.endcic, e->grs.opc, NULL, 0);
+                               ss7_hangup_cics(linkset, e->grs.startcic, e->grs.endcic, e->grs.opc);
                                break;
                        case ISUP_EVENT_CQM:
                                ast_debug(1, "Got Circuit group query message from CICs %d to %d\n", e->cqm.startcic, e->cqm.endcic);