diff -ur asterisk-1.8.9.0-old/channels/chan_agent.c asterisk-1.8.9.0/channels/chan_agent.c --- asterisk-1.8.9.0-old/channels/chan_agent.c 2012-01-31 16:05:27.000000000 -0500 +++ asterisk-1.8.9.0/channels/chan_agent.c 2012-01-31 17:22:28.000000000 -0500 @@ -1531,13 +1531,19 @@ if (p->owner && p->owner->_bridge) { talkingto = S_COR(p->chan->caller.id.number.valid, p->chan->caller.id.number.str, "n/a"); - ast_channel_lock(p->owner); - if ((bridge = ast_bridged_channel(p->owner))) { - talkingtoChan = ast_strdupa(bridge->name); + while (p->owner && ast_channel_trylock(p->owner)) { + DEADLOCK_AVOIDANCE(&p->lock); + } + if (p->owner) { + if ((bridge = ast_bridged_channel(p->owner))) { + talkingtoChan = ast_strdupa(bridge->name); + } else { + talkingtoChan = "n/a"; + } + ast_channel_unlock(p->owner); } else { talkingtoChan = "n/a"; } - ast_channel_unlock(p->owner); status = "AGENT_ONCALL"; } else { talkingto = "n/a"; @@ -1739,10 +1745,18 @@ username[0] = '\0'; if (p->chan) { snprintf(location, sizeof(location), "logged in on %s", p->chan->name); - if (p->owner && ast_bridged_channel(p->owner)) - snprintf(talkingto, sizeof(talkingto), " talking to %s", ast_bridged_channel(p->owner)->name); - else + while (p->owner && ast_channel_trylock(p->owner)) { + DEADLOCK_AVOIDANCE(&p->lock); + } + if (p->owner) { + if (ast_bridged_channel(p->owner)) + snprintf(talkingto, sizeof(talkingto), " talking to %s", ast_bridged_channel(p->owner)->name); + else + strcpy(talkingto, " is idle"); + ast_channel_unlock(p->owner); + } else { strcpy(talkingto, " is idle"); + } online_agents++; } else { strcpy(location, "not logged in"); @@ -1803,10 +1817,18 @@ username[0] = '\0'; if (p->chan) { snprintf(location, sizeof(location), "logged in on %s", p->chan->name); - if (p->owner && ast_bridged_channel(p->owner)) - snprintf(talkingto, sizeof(talkingto), " talking to %s", ast_bridged_channel(p->owner)->name); - else + while (p->owner && ast_channel_trylock(p->owner)) { + DEADLOCK_AVOIDANCE(&p->lock); + } + if (p->owner) { + if (ast_bridged_channel(p->owner)) + snprintf(talkingto, sizeof(talkingto), " talking to %s", ast_bridged_channel(p->owner)->name); + else + strcpy(talkingto, " is idle"); + ast_channel_unlock(p->owner); + } else { strcpy(talkingto, " is idle"); + } agent_status = 1; online_agents++; }