From ec6682ae75dbba5ad281ac960c98ca070dd2152c Mon Sep 17 00:00:00 2001 From: Eunki Hong Date: Fri, 12 Jan 2024 15:25:03 +0900 Subject: [PATCH] (Vector) Use mutex instead of ConditionalWait for EventhThreadCallback Since worker thread can call AddEventTriggerCallback freely, we should make some lock between workerthread and main thread(RemoveEventTriggerCallbacks, GetNextEventCallback, ~VectorAnimationThread). ConditionalWait used only for AsyncTask rasterization, and sleep thread. We'd better seperate those job locker. Change-Id: I543ba7f0bdf54036a8127d1815dda18cafca54e7 Signed-off-by: Eunki Hong --- .../vector-animation-thread.cpp | 56 ++++++++++++++-------- .../vector-animation-thread.h | 2 + 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.cpp b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.cpp index 8f70ae3..3ee2d5d 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.cpp +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -45,6 +45,7 @@ VectorAnimationThread::VectorAnimationThread() mWorkingTasks(), mSleepThread(MakeCallback(this, &VectorAnimationThread::OnAwakeFromSleep)), mConditionalWait(), + mEventTriggerMutex(), mNeedToSleep(false), mDestroyThread(false), mLogFactory(Dali::Adaptor::Get().GetLogFactory()), @@ -61,11 +62,18 @@ VectorAnimationThread::~VectorAnimationThread() // Stop the thread { ConditionalWait::ScopedLock lock(mConditionalWait); - mDestroyThread = true; - mNeedToSleep = false; + // Wait until some event thread trigger relative job finished. + { + Mutex::ScopedLock lock(mEventTriggerMutex); + mDestroyThread = true; + } + mNeedToSleep = false; mConditionalWait.Notify(lock); } + // Stop event trigger + mEventTrigger.reset(); + DALI_LOG_INFO(gVectorAnimationLogFilter, Debug::Verbose, "VectorAnimationThread::~VectorAnimationThread: Join [%p]\n", this); Join(); @@ -153,21 +161,27 @@ void VectorAnimationThread::OnAwakeFromSleep() void VectorAnimationThread::AddEventTriggerCallback(CallbackBase* callback) { - ConditionalWait::ScopedLock lock(mConditionalWait); - mTriggerEventCallbacks.push_back(callback); - - if(!mEventTriggered) + Mutex::ScopedLock lock(mEventTriggerMutex); + if(!mDestroyThread) { - mEventTrigger->Trigger(); - mEventTriggered = true; + mTriggerEventCallbacks.push_back(callback); + + if(!mEventTriggered) + { + mEventTrigger->Trigger(); + mEventTriggered = true; + } } } void VectorAnimationThread::RemoveEventTriggerCallbacks(CallbackBase* callback) { - ConditionalWait::ScopedLock lock(mConditionalWait); - auto iter = std::remove(mTriggerEventCallbacks.begin(), mTriggerEventCallbacks.end(), callback); - mTriggerEventCallbacks.erase(iter, mTriggerEventCallbacks.end()); + Mutex::ScopedLock lock(mEventTriggerMutex); + if(!mDestroyThread) + { + auto iter = std::remove(mTriggerEventCallbacks.begin(), mTriggerEventCallbacks.end(), callback); + mTriggerEventCallbacks.erase(iter, mTriggerEventCallbacks.end()); + } } void VectorAnimationThread::Run() @@ -270,16 +284,18 @@ void VectorAnimationThread::OnEventCallbackTriggered() CallbackBase* VectorAnimationThread::GetNextEventCallback() { - ConditionalWait::ScopedLock lock(mConditionalWait); - - if(!mTriggerEventCallbacks.empty()) + Mutex::ScopedLock lock(mEventTriggerMutex); + if(!mDestroyThread) { - auto iter = mTriggerEventCallbacks.begin(); - CallbackBase* callback = *iter; - mTriggerEventCallbacks.erase(iter); - return callback; + if(!mTriggerEventCallbacks.empty()) + { + auto iter = mTriggerEventCallbacks.begin(); + CallbackBase* callback = *iter; + mTriggerEventCallbacks.erase(iter); + return callback; + } + mEventTriggered = false; } - mEventTriggered = false; return nullptr; } diff --git a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.h b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.h index a5108d5..7421cc8 100644 --- a/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.h +++ b/dali-toolkit/internal/visuals/animated-vector-image/vector-animation-thread.h @@ -19,6 +19,7 @@ // EXTERNAL INCLUDES #include +#include #include #include #include @@ -165,6 +166,7 @@ private: std::vector mTriggerEventCallbacks{}; // Callbacks are not owned SleepThread mSleepThread; ConditionalWait mConditionalWait; + Mutex mEventTriggerMutex; std::unique_ptr mEventTrigger{}; bool mNeedToSleep; bool mDestroyThread; -- 2.7.4