diff --git a/channels/sig_pri.c b/channels/sig_pri.c index 4c70c6beaaf296b506d8bb9c5923ad4f256fa770..4bd5a5191f4cbb1b34b952de2f3286d875ff4450 100644 --- a/channels/sig_pri.c +++ b/channels/sig_pri.c @@ -1387,6 +1387,10 @@ static void pri_queue_control(struct sig_pri_span *pri, int chanpos, int subclas * \note Assumes the pri->lock is already obtained. * \note Assumes the sig_pri_lock_private(pri->pvts[chanpos]) is already obtained. * + * \note The unlocking/locking sequence now present has been stress tested + * without deadlocks. Please don't change it without consulting + * core development team members. + * * \return Nothing */ static void sig_pri_queue_hangup(struct sig_pri_span *pri, int chanpos) @@ -1404,9 +1408,11 @@ static void sig_pri_queue_hangup(struct sig_pri_span *pri, int chanpos) ast_queue_hangup(owner); ast_channel_unlock(owner); - /* Tell the CDR this DAHDI channel hung up */ sig_pri_unlock_private(pri->pvts[chanpos]); + ast_mutex_unlock(&pri->lock); + /* Tell the CDR this DAHDI channel hung up */ ast_set_hangupsource(owner, ast_channel_name(owner), 0); + ast_mutex_lock(&pri->lock); sig_pri_lock_private(pri->pvts[chanpos]); ao2_ref(owner, -1);