From 3b481ec39c45110f7ed3c7957850e4099b91f1da Mon Sep 17 00:00:00 2001 From: paul Date: Fri, 1 Dec 2006 19:49:33 +0000 Subject: [PATCH] Added locking to prevent race conditions --- .../eventScheduler/src/SchedulerThread.cxx | 21 +++++++++++++++---- .../eventScheduler/src/SchedulerThread.h | 4 ++++ 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/campcaster/src/modules/eventScheduler/src/SchedulerThread.cxx b/campcaster/src/modules/eventScheduler/src/SchedulerThread.cxx index 474542bab..f0ad5a7a4 100644 --- a/campcaster/src/modules/eventScheduler/src/SchedulerThread.cxx +++ b/campcaster/src/modules/eventScheduler/src/SchedulerThread.cxx @@ -68,6 +68,10 @@ SchedulerThread :: SchedulerThread( isPreloading(false) { //DEBUG_FUNC_INFO + pthread_mutexattr_init(&mutexAttr); + pthread_mutex_init(&nextEventLock, &mutexAttr); + pthread_mutex_init(&preloadLock, &mutexAttr); + pthread_mutexattr_destroy(&mutexAttr); } @@ -103,8 +107,10 @@ SchedulerThread :: getNextEvent(Ptr::Ref when) throw () void SchedulerThread :: nextStep(Ptr::Ref now) throw () { + pthread_mutex_lock(&nextEventLock); if (nextEvent) { if (imminent(now, nextInitTime)) { + pthread_mutex_lock(&preloadLock); debug() << "::nextStep() - Init [" << *TimeConversion::now() << "]" << endl; try { @@ -117,7 +123,6 @@ SchedulerThread :: nextStep(Ptr::Ref now) throw () std::cerr << "event initialization error: " << e.what() << std::endl; } - isPreloading = true; } else if (imminent(now, nextEventTime)) { Ptr::Ref timeLeft(new time_duration(*nextEventTime - *now)); @@ -128,9 +133,11 @@ SchedulerThread :: nextStep(Ptr::Ref now) throw () currentEvent = nextEvent; currentEventEnd = nextEventEnd; getNextEvent(TimeConversion::now()); - isPreloading = false; + pthread_mutex_unlock(&preloadLock); } } + + pthread_mutex_unlock(&nextEventLock); if (currentEvent && imminent(now, currentEventEnd)) { Ptr::Ref timeLeft(new time_duration(*currentEventEnd @@ -184,8 +191,14 @@ SchedulerThread :: signal(int signalId) throw () switch (signalId) { case UpdateSignal: - if (!isPreloading) { - getNextEvent(TimeConversion::now()); + if (!pthread_mutex_trylock(&nextEventLock)) { + if (!pthread_mutex_trylock(&preloadLock)) { + getNextEvent(TimeConversion::now()); + pthread_mutex_unlock(&preloadLock); + pthread_mutex_unlock(&nextEventLock); + } else { + pthread_mutex_unlock(&nextEventLock); + } } break; diff --git a/campcaster/src/modules/eventScheduler/src/SchedulerThread.h b/campcaster/src/modules/eventScheduler/src/SchedulerThread.h index ca3a65163..5cfabbeef 100644 --- a/campcaster/src/modules/eventScheduler/src/SchedulerThread.h +++ b/campcaster/src/modules/eventScheduler/src/SchedulerThread.h @@ -133,6 +133,10 @@ class SchedulerThread : public virtual RunnableInterface */ bool isPreloading; + pthread_mutex_t nextEventLock; + pthread_mutex_t preloadLock; + pthread_mutexattr_t mutexAttr; + /** * Default constructor. */