if(DALI_LIKELY(!mDestroyThread))
{
- mSleepTimePoint = timeToSleepUntil;
- mNeedToSleep = true;
- mConditionalWait.Notify(lock);
+ if(mSleepTimePoint != timeToSleepUntil) ///< Trigger only if new time point is changed.
+ {
+ mSleepTimePoint = timeToSleepUntil;
+ mNeedToSleep = true;
+ mConditionalWait.Notify(lock);
+ }
}
}
{
bool needToSleep = false;
- std::chrono::time_point<std::chrono::steady_clock> sleepTimePoint;
-
{
ConditionalWait::ScopedLock lock(mConditionalWait);
- Mutex::ScopedLock sleepLock(mSleepRequestMutex);
- if(DALI_LIKELY(!mDestroyThread))
+ ConditionalWait::TimePoint sleepTimePoint;
+
{
- needToSleep = mNeedToSleep;
- sleepTimePoint = mSleepTimePoint;
+ Mutex::ScopedLock sleepLock(mSleepRequestMutex);
- mNeedToSleep = false;
+ if(DALI_LIKELY(!mDestroyThread))
+ {
+ needToSleep = mNeedToSleep;
+ sleepTimePoint = mSleepTimePoint;
+ mNeedToSleep = false;
+ }
}
- }
-
- if(needToSleep)
- {
- DALI_TRACE_SCOPE(gTraceFilter, "VECTOR_ANIMATION_SLEEP_THREAD");
-
- std::this_thread::sleep_until(sleepTimePoint);
+ if(DALI_LIKELY(!mDestroyThread))
{
- Mutex::ScopedLock awakeLock(mAwakeCallbackMutex);
- if(DALI_LIKELY(mAwakeCallback))
+ DALI_TRACE_BEGIN_WITH_MESSAGE_GENERATOR(gTraceFilter, "VECTOR_ANIMATION_SLEEP_THREAD", [&](std::ostringstream& oss) {
+ oss << "[";
+ if(needToSleep)
+ {
+ auto currentTime = std::chrono::steady_clock::now();
+ auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(sleepTimePoint - currentTime);
+ oss << duration.count() << " ms]";
+ }
+ else
+ {
+ oss << "until notify]";
+ }
+ });
+
+ if(needToSleep)
+ {
+ mConditionalWait.WaitUntil(lock, sleepTimePoint);
+ }
+ else
{
- CallbackBase::Execute(*mAwakeCallback);
+ mConditionalWait.Wait(lock);
}
+
+ DALI_TRACE_END(gTraceFilter, "VECTOR_ANIMATION_SLEEP_THREAD");
}
}
+ if(DALI_LIKELY(!mDestroyThread) && needToSleep)
{
- ConditionalWait::ScopedLock lock(mConditionalWait);
- if(DALI_LIKELY(!mDestroyThread) && !mNeedToSleep)
+ Mutex::ScopedLock awakeLock(mAwakeCallbackMutex);
+ if(DALI_LIKELY(mAwakeCallback))
{
- DALI_TRACE_SCOPE(gTraceFilter, "VECTOR_ANIMATION_SLEEP_THREAD_WAIT");
- mConditionalWait.Wait(lock);
+ // Awake out of ConditionalWait::ScopedLock to avoid deadlock.
+ CallbackBase::Execute(*mAwakeCallback);
}
}
}