From 3696fbe740e4a2df43d3b08db9b71acb3fd40d21 Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Tue, 26 Aug 2008 15:27:23 +0000 Subject: [PATCH] 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/branches/1.4@140051 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_iax2.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index 64f616bb93..af380e9e5b 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -9082,15 +9082,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; tv = ast_tvadd(ast_tvnow(), ast_samp2tv(res, 1000)); ts.tv_sec = tv.tv_sec; ts.tv_nsec = tv.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();