Index: channels/chan_iax2.c =================================================================== --- channels/chan_iax2.c (revision 387927) +++ channels/chan_iax2.c (working copy) @@ -11509,12 +11509,12 @@ } break; case IAX_COMMAND_TXREJ: - iaxs[fr->callno]->transferring = 0; + iaxs[fr->callno]->transferring = TRANSFER_NONE; ast_verb(3, "Channel '%s' unable to transfer\n", iaxs[fr->callno]->owner ? ast_channel_name(iaxs[fr->callno]->owner) : ""); memset(&iaxs[fr->callno]->transfer, 0, sizeof(iaxs[fr->callno]->transfer)); if (iaxs[fr->callno]->bridgecallno) { if (iaxs[iaxs[fr->callno]->bridgecallno]->transferring) { - iaxs[iaxs[fr->callno]->bridgecallno]->transferring = 0; + iaxs[iaxs[fr->callno]->bridgecallno]->transferring = TRANSFER_NONE; send_command(iaxs[iaxs[fr->callno]->bridgecallno], AST_FRAME_IAX, IAX_COMMAND_TXREJ, 0, NULL, 0, -1); } } @@ -11522,11 +11522,23 @@ case IAX_COMMAND_TXREADY: if ((iaxs[fr->callno]->transferring == TRANSFER_BEGIN) || (iaxs[fr->callno]->transferring == TRANSFER_MBEGIN)) { - if (iaxs[fr->callno]->transferring == TRANSFER_MBEGIN) + if (iaxs[fr->callno]->bridgecallno) { + while (ast_mutex_trylock(&iaxsl[iaxs[fr->callno]->bridgecallno])) { + DEADLOCK_AVOIDANCE(&iaxsl[fr->callno]); + } + if (!iaxs[fr->callno]){ + break; + } + } + + if (iaxs[fr->callno]->transferring == TRANSFER_MBEGIN) { iaxs[fr->callno]->transferring = TRANSFER_MREADY; - else + } else { iaxs[fr->callno]->transferring = TRANSFER_READY; + } + ast_verb(3, "Channel '%s' ready to transfer\n", iaxs[fr->callno]->owner ? ast_channel_name(iaxs[fr->callno]->owner) : ""); + if (iaxs[fr->callno]->bridgecallno) { if ((iaxs[iaxs[fr->callno]->bridgecallno]->transferring == TRANSFER_READY) || (iaxs[iaxs[fr->callno]->bridgecallno]->transferring == TRANSFER_MREADY)) { @@ -11566,6 +11578,7 @@ } } + ast_mutex_unlock(&iaxsl[iaxs[fr->callno]->bridgecallno]); } } break;