summaryrefslogtreecommitdiff
path: root/main
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2013-05-18 22:49:14 +0000
committerJoshua Colp <jcolp@digium.com>2013-05-18 22:49:14 +0000
commit7316abeb8f4864bbaa0f26a557055d1af8d3a455 (patch)
tree21fc398bbda053f2e8a609ed5e528e5915c88ad7 /main
parent4e38a4eb6459ef79ebee61c87f144e0d5d0122eb (diff)
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
Diffstat (limited to 'main')
-rw-r--r--main/pbx.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/main/pbx.c b/main/pbx.c
index 3acee2d40..41a46fefe 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);
}