aboutsummaryrefslogtreecommitdiffstats
path: root/main/dial.c
diff options
context:
space:
mode:
authorfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2008-01-16 15:09:37 +0000
committerfile <file@f38db490-d61c-443f-a65b-d21fe96a405b>2008-01-16 15:09:37 +0000
commite062ea7c24994b7ffd19b887128151499e74a652 (patch)
tree6603c53776ecf536d1db7b8cdd243ad9889150d8 /main/dial.c
parent67d23f85bc87d1c51fd5c373943dd8cdf1a25f09 (diff)
Merged revisions 98960 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r98960 | file | 2008-01-16 11:08:24 -0400 (Wed, 16 Jan 2008) | 6 lines Introduce a lock into the dialing API that protects it when destroying the structure. (closes issue #11687) Reported by: callguy Patches: 11687.diff uploaded by file (license 11) ........ git-svn-id: http://svn.digium.com/svn/asterisk/trunk@98961 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main/dial.c')
-rw-r--r--main/dial.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/main/dial.c b/main/dial.c
index 1fd5bfe81..7b6ce871e 100644
--- a/main/dial.c
+++ b/main/dial.c
@@ -48,6 +48,7 @@ struct ast_dial {
ast_dial_state_callback state_callback; /*!< Status callback */
AST_LIST_HEAD_NOLOCK(, ast_dial_channel) channels; /*!< Channels being dialed */
pthread_t thread; /*!< Thread (if running in async) */
+ ast_mutex_t lock; /*! Lock to protect the thread information above */
};
/*! \brief Dialing channel structure. Contains per-channel dialing options, asterisk channel, and more! */
@@ -149,10 +150,12 @@ static void answer_exec_run(struct ast_dial *dial, struct ast_dial_channel *dial
pbx_exec(chan, ast_app, args);
/* If another thread is not taking over hang up the channel */
+ ast_mutex_lock(&dial->lock);
if (dial->thread != AST_PTHREADT_STOP) {
ast_hangup(chan);
dial_channel->owner = NULL;
}
+ ast_mutex_unlock(&dial->lock);
return;
}
@@ -209,6 +212,9 @@ struct ast_dial *ast_dial_create(void)
dial->timeout = -1;
dial->actual_timeout = -1;
+ /* Can't forget about the lock */
+ ast_mutex_init(&dial->lock);
+
return dial;
}
@@ -739,6 +745,9 @@ enum ast_dial_result ast_dial_join(struct ast_dial *dial)
/* Record thread */
thread = dial->thread;
+ /* Boom, commence locking */
+ ast_mutex_lock(&dial->lock);
+
/* Stop the thread */
dial->thread = AST_PTHREADT_STOP;
@@ -753,6 +762,9 @@ enum ast_dial_result ast_dial_join(struct ast_dial *dial)
pthread_kill(thread, SIGURG);
}
+ /* Yay done with it */
+ ast_mutex_unlock(&dial->lock);
+
/* Finally wait for the thread to exit */
pthread_join(thread, NULL);
@@ -828,6 +840,9 @@ int ast_dial_destroy(struct ast_dial *dial)
dial->options[i] = NULL;
}
+ /* Lock be gone! */
+ ast_mutex_destroy(&dial->lock);
+
/* Free structure */
ast_free(dial);