From 7316abeb8f4864bbaa0f26a557055d1af8d3a455 Mon Sep 17 00:00:00 2001 From: Joshua Colp <jcolp@digium.com> Date: Sat, 18 May 2013 22:49:14 +0000 Subject: [PATCH] Fix a bug where synchronous origination (oddly enough triggered by doing an async manager Originate) would not work properly. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@389085 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- main/pbx.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/main/pbx.c b/main/pbx.c index 3acee2d404..41a46fefe0 100644 --- a/main/pbx.c +++ b/main/pbx.c @@ -9963,10 +9963,11 @@ static void pbx_outgoing_destroy(void *obj) static void *pbx_outgoing_exec(void *data) { RAII_VAR(struct pbx_outgoing *, outgoing, data, ao2_cleanup); - enum ast_dial_result res = ast_dial_run(outgoing->dial, NULL, 0); + enum ast_dial_result res; /* Notify anyone interested that dialing is complete */ ast_mutex_lock(&outgoing->lock); + res = ast_dial_run(outgoing->dial, NULL, 0); outgoing->dialed = 1; ast_cond_signal(&outgoing->cond); ast_mutex_unlock(&outgoing->lock); @@ -9976,6 +9977,7 @@ static void *pbx_outgoing_exec(void *data) return NULL; } + ast_mutex_lock(&outgoing->lock); if (!ast_strlen_zero(outgoing->app)) { struct ast_app *app = pbx_findapp(outgoing->app); @@ -10010,7 +10012,6 @@ static void *pbx_outgoing_exec(void *data) } /* Notify anyone else again that may be interested that execution is complete */ - ast_mutex_lock(&outgoing->lock); outgoing->executed = 1; ast_cond_signal(&outgoing->cond); ast_mutex_unlock(&outgoing->lock); @@ -10126,9 +10127,15 @@ static int pbx_outgoing_attempt(const char *type, struct ast_format_cap *cap, co /* Wait for dialing to complete */ if (synchronous) { ast_mutex_lock(&outgoing->lock); + if (channel) { + ast_channel_unlock(*channel); + } while (!outgoing->dialed) { ast_cond_wait(&outgoing->cond, &outgoing->lock); } + if (channel) { + ast_channel_lock(*channel); + } ast_mutex_unlock(&outgoing->lock); } -- GitLab