Index: channels/chan_local.c =================================================================== --- channels/chan_local.c (revision 300344) +++ channels/chan_local.c (working copy) @@ -749,15 +749,17 @@ if ((status) && (p->owner)) { /* Deadlock avoidance */ while (p->owner && ast_channel_trylock(p->owner)) { - ao2_unlock(p); if (p->chan) { ast_channel_unlock(p->chan); } + ao2_unlock(p); sched_yield(); - if (p->chan) { - ast_channel_lock(p->chan); + ao2_lock(p)); + while (p->chan && ast_channel_trylock(p->chan)) { + ao2_unlock(p); + sched_yield(); + ao2_lock(p); } - ao2_lock(p); } if (p->owner) { pbx_builtin_setvar_helper(p->owner, "CHANLOCALSTATUS", status); @@ -780,15 +782,17 @@ } else { ast_module_user_remove(p->u_owner); while (p->chan && ast_channel_trylock(p->chan)) { - ao2_unlock(p); if (p->owner) { ast_channel_unlock(p->owner); } + ao2_unlock(p); sched_yield(); - if (p->owner) { - ast_channel_lock(p->owner); + ao2_lock(p); + while (p->owner && ast_channel_trylock(p->owner)) { + ao2_unlock(p); + sched_yield(); + ao2_lock(p); } - ao2_lock(p); } if (p->chan) { ast_queue_hangup(p->chan);