diff options
author | Mark Spencer <markster@digium.com> | 2004-02-19 20:07:01 +0000 |
---|---|---|
committer | Mark Spencer <markster@digium.com> | 2004-02-19 20:07:01 +0000 |
commit | 0b8234edb467a089258f56f73fa11d4e91b71cc2 (patch) | |
tree | 2cf1ee61d56cf6a047873f4ba8ff930b826c4460 /channel.c | |
parent | b2a648b4da6559bf7343df84e226a5411b2e9c03 (diff) |
Don't free clone lock until after *both* fixups have taken place
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@2199 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'channel.c')
-rwxr-xr-x | channel.c | 28 |
1 files changed, 15 insertions, 13 deletions
@@ -2089,19 +2089,6 @@ static int ast_do_masquerade(struct ast_channel *original) /* Context, extension, priority, app data, jump table, remain the same */ /* pvt switches. pbx stays the same, as does next */ - /* Now, at this point, the "clone" channel is totally F'd up. We mark it as - a zombie so nothing tries to touch it. If it's already been marked as a - zombie, then free it now (since it already is considered invalid). */ - if (clone->zombie) { - ast_log(LOG_DEBUG, "Destroying clone '%s'\n", clone->name); - ast_mutex_unlock(&clone->lock); - ast_channel_free(clone); - manager_event(EVENT_FLAG_CALL, "Hangup", "Channel: %s\r\n", zombn); - } else { - ast_log(LOG_DEBUG, "Released clone lock on '%s'\n", clone->name); - clone->zombie=1; - ast_mutex_unlock(&clone->lock); - } /* Set the write format */ ast_set_write_format(original, wformat); @@ -2122,6 +2109,21 @@ static int ast_do_masquerade(struct ast_channel *original) } else ast_log(LOG_WARNING, "Driver '%s' does not have a fixup routine (for %s)! Bad things may happen.\n", original->type, original->name); + + /* Now, at this point, the "clone" channel is totally F'd up. We mark it as + a zombie so nothing tries to touch it. If it's already been marked as a + zombie, then free it now (since it already is considered invalid). */ + if (clone->zombie) { + ast_log(LOG_DEBUG, "Destroying clone '%s'\n", clone->name); + ast_mutex_unlock(&clone->lock); + ast_channel_free(clone); + manager_event(EVENT_FLAG_CALL, "Hangup", "Channel: %s\r\n", zombn); + } else { + ast_log(LOG_DEBUG, "Released clone lock on '%s'\n", clone->name); + clone->zombie=1; + ast_mutex_unlock(&clone->lock); + } + /* Signal any blocker */ if (original->blocking) pthread_kill(original->blocker, SIGURG); |