diff options
author | Richard Mudgett <rmudgett@digium.com> | 2011-04-08 16:17:32 +0000 |
---|---|---|
committer | Richard Mudgett <rmudgett@digium.com> | 2011-04-08 16:17:32 +0000 |
commit | ce17f956dceeed7a7bf6866223f1f88f359548c6 (patch) | |
tree | a50d5fded9b71f7c7c9ee5410731a2df5999e852 /channels/sig_ss7.c | |
parent | 68dd87ef0dd9e4362e1dcc38c04c9c8b09e002c1 (diff) |
Add private lock deadlock avoidance callback to PRI and SS7.
Factor out the equivalent function for analog.
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@313100 65c4cc65-6c06-0410-ace0-fbb531ad65f3
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 */ |