diff --git a/channels/chan_local.c b/channels/chan_local.c index 7a9bda356949661aea95e51fcf1b65129234862b..337aadc7ca323b41db156241017a28424b7c44e1 100644 --- a/channels/chan_local.c +++ b/channels/chan_local.c @@ -667,12 +667,12 @@ static int local_hangup(struct ast_channel *ast) /* Deadlock avoidance */ while (p->owner && ast_channel_trylock(p->owner)) { ast_mutex_unlock(&p->lock); - if (ast) { - ast_channel_unlock(ast); + if (p->chan) { + ast_channel_unlock(p->chan); } usleep(1); - if (ast) { - ast_channel_lock(ast); + if (p->chan) { + ast_channel_lock(p->chan); } ast_mutex_lock(&p->lock); } @@ -687,8 +687,17 @@ static int local_hangup(struct ast_channel *ast) } else { ast_module_user_remove(p->u_owner); while (p->chan && ast_channel_trylock(p->chan)) { - DEADLOCK_AVOIDANCE(&p->lock); + ast_mutex_unlock(&p->lock); + if (p->owner) { + ast_channel_unlock(p->owner); + } + usleep(1); + if (p->owner) { + ast_channel_lock(p->owner); + } + ast_mutex_lock(&p->lock); } + p->owner = NULL; if (p->chan) { ast_queue_hangup(p->chan); diff --git a/main/channel.c b/main/channel.c index d958559b50ac85c3a438fb14240609de7f15cb0d..ca6cdf89b63b5af2338612b2ebabc694f29d4aa9 100644 --- a/main/channel.c +++ b/main/channel.c @@ -2544,25 +2544,22 @@ int ast_activate_generator(struct ast_channel *chan, struct ast_generator *gen, int res = 0; ast_channel_lock(chan); - if (chan->generatordata) { if (chan->generator && chan->generator->release) chan->generator->release(chan, chan->generatordata); chan->generatordata = NULL; } - - ast_prod(chan); if (gen->alloc && !(chan->generatordata = gen->alloc(chan, params))) { res = -1; } - if (!res) { ast_settimeout(chan, 50, generator_force, chan); chan->generator = gen; } - ast_channel_unlock(chan); + ast_prod(chan); + return res; }