summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
7f58db6)
Do not execute a callback with lock
Reset callback pointers after removing
Change-Id: I1f617af4ee89e43c8ab891efbd0beaea14feaea1
if(mAnimationFinishedCallback)
{
mVectorAnimationThread.RemoveEventTriggerCallback(mAnimationFinishedCallback.get());
if(mAnimationFinishedCallback)
{
mVectorAnimationThread.RemoveEventTriggerCallback(mAnimationFinishedCallback.get());
+ mAnimationFinishedCallback.reset();
}
if(mLoadCompletedCallback)
{
mVectorAnimationThread.RemoveEventTriggerCallback(mLoadCompletedCallback.get());
}
if(mLoadCompletedCallback)
{
mVectorAnimationThread.RemoveEventTriggerCallback(mLoadCompletedCallback.get());
+ mLoadCompletedCallback.reset();
}
mVectorRenderer.Finalize();
}
mVectorRenderer.Finalize();
DALI_LOG_ERROR("VectorAnimationTask::Load: Load failed [%s]\n", mUrl.c_str());
mLoadRequest = false;
mLoadFailed = true;
DALI_LOG_ERROR("VectorAnimationTask::Load: Load failed [%s]\n", mUrl.c_str());
mLoadRequest = false;
mLoadFailed = true;
- if(!synchronousLoading)
+ if(!synchronousLoading && mLoadCompletedCallback)
{
mVectorAnimationThread.AddEventTriggerCallback(mLoadCompletedCallback.get());
}
{
mVectorAnimationThread.AddEventTriggerCallback(mLoadCompletedCallback.get());
}
mFrameDurationMicroSeconds = MICROSECONDS_PER_SECOND / mFrameRate;
mLoadRequest = false;
mFrameDurationMicroSeconds = MICROSECONDS_PER_SECOND / mFrameRate;
mLoadRequest = false;
- if(!synchronousLoading)
+ if(!synchronousLoading && mLoadCompletedCallback)
{
mVectorAnimationThread.AddEventTriggerCallback(mLoadCompletedCallback.get());
}
{
mVectorAnimationThread.AddEventTriggerCallback(mLoadCompletedCallback.get());
}
void VectorAnimationThread::OnEventCallbackTriggered()
{
void VectorAnimationThread::OnEventCallbackTriggered()
{
+ while(CallbackBase* callback = GetNextEventCallback())
+ {
+ CallbackBase::Execute(*callback);
+ }
+}
+
+CallbackBase* VectorAnimationThread::GetNextEventCallback()
+{
ConditionalWait::ScopedLock lock(mConditionalWait);
ConditionalWait::ScopedLock lock(mConditionalWait);
- for(auto&& iter : mTriggerEventCallbacks)
+ if(!mTriggerEventCallbacks.empty())
- CallbackBase::Execute(*iter);
+ auto iter = mTriggerEventCallbacks.begin();
+ CallbackBase* callback = *iter;
+ mTriggerEventCallbacks.erase(iter);
+ return callback;
-
- mTriggerEventCallbacks.clear();
}
VectorAnimationThread::SleepThread::SleepThread(CallbackBase* callback)
}
VectorAnimationThread::SleepThread::SleepThread(CallbackBase* callback)
- * Rasterizes the tasks.
+ * @brief Rasterizes the tasks.
void OnEventCallbackTriggered();
/**
void OnEventCallbackTriggered();
/**
+ * @brief Gets next event callback to process.
+ */
+ CallbackBase* GetNextEventCallback();
+
+ /**
* @brief The thread to sleep until the next frame time.
*/
class SleepThread : public Thread
* @brief The thread to sleep until the next frame time.
*/
class SleepThread : public Thread