aboutsummaryrefslogtreecommitdiffstats
path: root/channels/sig_pri.c
diff options
context:
space:
mode:
Diffstat (limited to 'channels/sig_pri.c')
-rw-r--r--channels/sig_pri.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/channels/sig_pri.c b/channels/sig_pri.c
index e76db86ac..308fa5dc8 100644
--- a/channels/sig_pri.c
+++ b/channels/sig_pri.c
@@ -321,6 +321,16 @@ static void sig_pri_lock_private(struct sig_pri_chan *p)
p->calls->lock_private(p->chan_pvt);
}
+static void sig_pri_deadlock_avoidance_private(struct sig_pri_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. */
+ PRI_DEADLOCK_AVOIDANCE(p);
+ }
+}
+
static inline int pri_grab(struct sig_pri_chan *p, struct sig_pri_span *pri)
{
int res;
@@ -328,7 +338,7 @@ static inline int pri_grab(struct sig_pri_chan *p, struct sig_pri_span *pri)
do {
res = ast_mutex_trylock(&pri->lock);
if (res) {
- PRI_DEADLOCK_AVOIDANCE(p);
+ sig_pri_deadlock_avoidance_private(p);
}
} while (res);
/* Then break the poll */
@@ -1123,7 +1133,7 @@ static void sig_pri_lock_owner(struct sig_pri_span *pri, int chanpos)
}
/* We must unlock the PRI to avoid the possibility of a deadlock */
ast_mutex_unlock(&pri->lock);
- PRI_DEADLOCK_AVOIDANCE(pri->pvts[chanpos]);
+ sig_pri_deadlock_avoidance_private(pri->pvts[chanpos]);
ast_mutex_lock(&pri->lock);
}
}