From cb90752b0d2de3d1c9711bf4eb7095f3215f3721 Mon Sep 17 00:00:00 2001 From: Matthew Fredrickson <creslin@digium.com> Date: Fri, 14 Nov 2008 16:34:33 +0000 Subject: [PATCH] Remove some useless locking and make sure we hangup channels on a link when we get a GRS. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@156874 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_dahdi.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index c975a1eea7..4dcea78910 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -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); -- GitLab