summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRussell Bryant <russell@russellbryant.com>2008-08-26 15:29:25 +0000
committerRussell Bryant <russell@russellbryant.com>2008-08-26 15:29:25 +0000
commitb296adfe8e48d57a351d1b21ccc2bff57df326f6 (patch)
treed4b34bfc1d419a8de569efbab6fafd67095a86a5
parent8903409298a79930caa034ab0b27b5a5de4a9979 (diff)
Merged revisions 140051 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r140051 | russell | 2008-08-26 10:27:23 -0500 (Tue, 26 Aug 2008) | 15 lines Fix a race condition with the IAX scheduler thread. A lock and condition are used here to allow newly scheduled tasks to wake up the scheduler just in case the new task needs to run sooner than the current wakeup time when the thread is sleeping. However, there was a race condition such that a newly scheduled task would not properly wake up the scheduler or affect the wake up period. The order of execution would have been: 1) Scheduler thread determines wake up time of N ms. 2) Another thread schedules a task and signals the condition, with an execution time of < N ms. 3) Scheduler thread locks and goes to sleep for N ms. By moving the sleep time determination to inside the critical section, this possibility is avoided. ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@140053 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r--channels/chan_iax2.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c
index b000561c3..eb7383db3 100644
--- a/channels/chan_iax2.c
+++ b/channels/chan_iax2.c
@@ -10155,15 +10155,14 @@ static void *sched_thread(void *ignore)
struct timespec ts;
for (;;) {
+ pthread_testcancel();
+ ast_mutex_lock(&sched_lock);
res = ast_sched_wait(sched);
if ((res > 1000) || (res < 0))
res = 1000;
wait = ast_tvadd(ast_tvnow(), ast_samp2tv(res, 1000));
ts.tv_sec = wait.tv_sec;
ts.tv_nsec = wait.tv_usec * 1000;
-
- pthread_testcancel();
- ast_mutex_lock(&sched_lock);
ast_cond_timedwait(&sched_cond, &sched_lock, &ts);
ast_mutex_unlock(&sched_lock);
pthread_testcancel();