diff options
author | Richard Mudgett <rmudgett@digium.com> | 2011-04-05 18:47:11 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2011-04-05 18:47:11 +0000 |
commit | 698a356737bc396c967202feb2620979f1596694 (patch) | |
tree | 6b605e7c36fc7beaf76b3e239839e89e124cd763 | |
parent | ad30fa75692f92d72be81133de789c6a27d50233 (diff) |
Merged revisions 312949 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.8
........
r312949 | rmudgett | 2011-04-05 13:45:24 -0500 (Tue, 05 Apr 2011) | 6 lines
Crash if ISDN span layer 1 is down on initial load.
Regression from -r312575 B channel shifting during negotiation.
* Also combine updating the alarm flag with clearing the resetting flag.
........
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@312950 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | channels/chan_dahdi.c | 4 | ||||
-rw-r--r-- | channels/sig_pri.c | 12 | ||||
-rw-r--r-- | channels/sig_pri.h | 1 |
3 files changed, 10 insertions, 7 deletions
diff --git a/channels/chan_dahdi.c b/channels/chan_dahdi.c index e1c4a26bc..04105ad59 100644 --- a/channels/chan_dahdi.c +++ b/channels/chan_dahdi.c @@ -12757,9 +12757,7 @@ static struct dahdi_pvt *mkintf(int channel, const struct dahdi_chan_conf *conf, switch (tmp->sig) { #ifdef HAVE_PRI case SIG_PRI_LIB_HANDLE_CASES: - ast_mutex_lock(&tmp->lock); - sig_pri_chan_alarm_notify(tmp->sig_pvt, si.alarms); - ast_mutex_unlock(&tmp->lock); + sig_pri_set_alarm(tmp->sig_pvt, !si.alarms); break; #endif #if defined(HAVE_SS7) diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 0e76fda53..197caec97 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -178,8 +178,15 @@ static void sig_pri_set_digital(struct sig_pri_chan *p, int is_digital) } } -static void sig_pri_set_alarm(struct sig_pri_chan *p, int in_alarm) +void sig_pri_set_alarm(struct sig_pri_chan *p, int in_alarm) { + /* + * Clear the channel restart flag when the channel alarm changes + * to prevent the flag from getting stuck when the link goes + * down. + */ + p->resetting = 0; + p->inalarm = in_alarm; if (p->calls->set_alarm) { p->calls->set_alarm(p->chan_pvt, in_alarm); @@ -5555,7 +5562,6 @@ static void *pri_dchannel(void *vpri) for (i = 0; i < pri->numchans; i++) { if (pri->pvts[i]) { sig_pri_set_alarm(pri->pvts[i], 0); - pri->pvts[i]->resetting = 0; } } sig_pri_span_devstate_changed(pri); @@ -5584,7 +5590,6 @@ static void *pri_dchannel(void *vpri) p->owner->_softhangup |= AST_SOFTHANGUP_DEV; } sig_pri_set_alarm(p, 1); - p->resetting = 0; } } sig_pri_span_devstate_changed(pri); @@ -8488,7 +8493,6 @@ int sig_pri_start_pri(struct sig_pri_span *pri) void sig_pri_chan_alarm_notify(struct sig_pri_chan *p, int noalarm) { pri_grab(p, p->pri); - p->resetting = 0; sig_pri_set_alarm(p, !noalarm); if (!noalarm) { if (pri_get_timer(p->pri->pri, PRI_TIMER_T309) < 0) { diff --git a/channels/sig_pri.h b/channels/sig_pri.h index f75646e3f..148397fc6 100644 --- a/channels/sig_pri.h +++ b/channels/sig_pri.h @@ -581,6 +581,7 @@ int sig_pri_digit_begin(struct sig_pri_chan *pvt, struct ast_channel *ast, char void sig_pri_stop_pri(struct sig_pri_span *pri); int sig_pri_start_pri(struct sig_pri_span *pri); +void sig_pri_set_alarm(struct sig_pri_chan *p, int in_alarm); void sig_pri_chan_alarm_notify(struct sig_pri_chan *p, int noalarm); void pri_event_alarm(struct sig_pri_span *pri, int index, int before_start_pri); |