]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
This exact deadlock situation that I observed can't happen in trunk due to the
authorRussell Bryant <russell@russellbryant.com>
Tue, 25 Jul 2006 19:51:31 +0000 (19:51 +0000)
committerRussell Bryant <russell@russellbryant.com>
Tue, 25 Jul 2006 19:51:31 +0000 (19:51 +0000)
recent hold changes so that MOH is not started on the bridged channel directly.
However, the change is still not a bad idea.

Merged revisions 38200 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.2

........
r38200 | russell | 2006-07-25 15:43:38 -0400 (Tue, 25 Jul 2006) | 6 lines

This resolves a deadlock that a tech support customer was getting frequently
when his users would answer call waiting. If another thread is currently
holding the zt_pvt lock for the first channel, unlock both channels and let
asterisk retry the native bridge, just like what is done for the second channel
directly below these changes.

........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@38201 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_zap.c

index 3aa84d006447f8de568db7adbe9eb678d881bab2..b0578e77697b5902b057251046e346681ea117d9 100644 (file)
@@ -3117,7 +3117,13 @@ static enum ast_bridge_result zt_bridge(struct ast_channel *c0, struct ast_chann
        oc0 = p0->owner;
        oc1 = p1->owner;
 
-       ast_mutex_lock(&p0->lock);
+       if (ast_mutex_trylock(&p0->lock)) {
+               /* Don't block, due to potential for deadlock */
+               ast_mutex_unlock(&c0->lock);
+               ast_mutex_unlock(&c1->lock);
+               ast_log(LOG_NOTICE, "Avoiding deadlock...\n");
+               return AST_BRIDGE_RETRY;
+       }
        if (ast_mutex_trylock(&p1->lock)) {
                /* Don't block, due to potential for deadlock */
                ast_mutex_unlock(&p0->lock);