summaryrefslogtreecommitdiff
path: root/channels/sig_ss7.c
diff options
context:
space:
mode:
authorRichard Mudgett <rmudgett@digium.com>2011-04-08 16:17:32 +0000
committerRichard Mudgett <rmudgett@digium.com>2011-04-08 16:17:32 +0000
commitce17f956dceeed7a7bf6866223f1f88f359548c6 (patch)
treea50d5fded9b71f7c7c9ee5410731a2df5999e852 /channels/sig_ss7.c
parent68dd87ef0dd9e4362e1dcc38c04c9c8b09e002c1 (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.c14
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 */