diff --git a/main/pbx.c b/main/pbx.c index 3acee2d404f6787de64a5a146b9ed1331666e6f5..41a46fefe013b5b61dd09f30c6d6ff9d6fad33b6 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); }