diff options
Diffstat (limited to 'channels/sig_ss7.c')
-rw-r--r-- | channels/sig_ss7.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/channels/sig_ss7.c b/channels/sig_ss7.c index 68ebc5a10..ebc5ca858 100644 --- a/channels/sig_ss7.c +++ b/channels/sig_ss7.c @@ -64,6 +64,16 @@ static void sig_ss7_lock_private(struct sig_ss7_chan *p) } } +static void sig_ss7_deadlock_avoidance_private(struct sig_ss7_chan *p) +{ + if (p->calls->deadlock_avoidance_private) { + p->calls->deadlock_avoidance_private(p->chan_pvt); + } else { + /* Fallback to the old way if callback not present. */ + SIG_SS7_DEADLOCK_AVOIDANCE(p); + } +} + void sig_ss7_set_alarm(struct sig_ss7_chan *p, int in_alarm) { p->inalarm = in_alarm; @@ -255,7 +265,7 @@ static void sig_ss7_lock_owner(struct sig_ss7_linkset *ss7, int chanpos) } /* We must unlock the SS7 to avoid the possibility of a deadlock */ ast_mutex_unlock(&ss7->lock); - SIG_SS7_DEADLOCK_AVOIDANCE(ss7->pvts[chanpos]); + sig_ss7_deadlock_avoidance_private(ss7->pvts[chanpos]); ast_mutex_lock(&ss7->lock); } } @@ -1109,7 +1119,7 @@ static inline int ss7_grab(struct sig_ss7_chan *pvt, struct sig_ss7_linkset *ss7 do { res = ast_mutex_trylock(&ss7->lock); if (res) { - SIG_SS7_DEADLOCK_AVOIDANCE(pvt); + sig_ss7_deadlock_avoidance_private(pvt); } } while (res); /* Then break the poll */ |