Merge "sig_pri: Fix deadlock caused by sig_pri_queue_hangup" into 16

This commit is contained in:
Joshua Colp 2020-01-08 09:41:38 -06:00 committed by Gerrit Code Review
commit 324a6098e6
1 changed files with 7 additions and 1 deletions

View File

@ -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);