Index: channels/chan_agent.c =================================================================== RCS file: /usr/cvsroot/asterisk/channels/chan_agent.c,v retrieving revision 1.168 diff -u -r1.168 chan_agent.c --- channels/chan_agent.c 8 Nov 2005 04:02:35 -0000 1.168 +++ channels/chan_agent.c 15 Nov 2005 20:43:31 -0000 @@ -811,11 +811,16 @@ ast_mutex_unlock(&p->lock); ast_device_state_changed("Agent/%s", p->agent); - if (p->pending) { - ast_mutex_lock(&agentlock); - agent_unlink(p); - ast_mutex_unlock(&agentlock); - } + /* Always unlink the agent */ + ast_mutex_lock(&agentlock); + agent_unlink(p); + ast_mutex_unlock(&agentlock); + + /* One more lock sequence, and there should be no more contenders for this channel + * so we can safely go away */ + ast_mutex_lock(&p->lock); + ast_mutex_unlock(&p->lock); + if (p->abouttograb) { /* Let the "about to grab" thread know this isn't valid anymore, and let it kill it later */