if(observer)
{
DALI_LOG_RELEASE_INFO("RequestLoad -> connect DestructionSignal to observer : %p, task : %u\n", observer, mTaskId);
+ observer->ConnectDestructionSignal();
observer->DestructionSignal().Connect(this, &AsyncTextManager::ObserverDestroyed);
}
if(it->second.mObserver)
{
DALI_LOG_RELEASE_INFO("RequestCancel -> ob : %p, remove wating task : %u\n", it->second.mObserver, taskId);
- it->second.mObserver->DestructionSignal().Disconnect(this, &AsyncTextManager::ObserverDestroyed);
+ if(it->second.mObserver->DisconnectDestructionSignal())
+ {
+ it->second.mObserver->DestructionSignal().Disconnect(this, &AsyncTextManager::ObserverDestroyed);
+ }
}
Dali::AsyncTaskManager::Get().RemoveTask(it->second.mTask);
mWaitingTasks.erase(it);
if(it->second.mObserver)
{
DALI_LOG_RELEASE_INFO("RequestCancel -> ob : %p, remove running task : %u\n", it->second.mObserver, taskId);
- it->second.mObserver->DestructionSignal().Disconnect(this, &AsyncTextManager::ObserverDestroyed);
+ if(it->second.mObserver->DisconnectDestructionSignal())
+ {
+ it->second.mObserver->DestructionSignal().Disconnect(this, &AsyncTextManager::ObserverDestroyed);
+ }
}
mRunningTasks.erase(it);
return;
DALI_LOG_RELEASE_INFO("LoadComplete -> ob : %p, remove task : %u\n", it->second.mObserver, taskId);
// TODO : If it fails for any reason, false should be sent.
bool success = true;
- it->second.mObserver->DestructionSignal().Disconnect(this, &AsyncTextManager::ObserverDestroyed);
+ if(it->second.mObserver->DisconnectDestructionSignal())
+ {
+ it->second.mObserver->DestructionSignal().Disconnect(this, &AsyncTextManager::ObserverDestroyed);
+ }
it->second.mObserver->LoadComplete(success, TextLoadObserver::TextInformation(task->mRenderInfo, task->mParameters));
}
else
{
DALI_LOG_RELEASE_INFO("-->AsyncTextManager::ObserverDestroyed observer : %p\n", observer);
- for(auto it = mRunningTasks.begin(); it != mRunningTasks.end(); ++ it)
+ for(auto it = mRunningTasks.begin(); it != mRunningTasks.end();)
{
if(it->second.mObserver == observer)
{
it->second.mObserver = nullptr;
it = mRunningTasks.erase(it);
- break;
+ }
+ else
+ {
+ ++it;
}
}
- for(auto it = mWaitingTasks.begin(); it != mWaitingTasks.end(); ++ it)
+ for(auto it = mWaitingTasks.begin(); it != mWaitingTasks.end();)
{
if(it->second.mObserver == observer)
{
Dali::AsyncTaskManager::Get().RemoveTask(it->second.mTask);
it->second.mObserver = nullptr;
it = mWaitingTasks.erase(it);
- break;
+ }
+ else
+ {
+ ++it;
}
}
}
}
TextLoadObserver::TextLoadObserver()
+: mDestructionSignalConnect(0)
{
}
return mDestructionSignal;
}
+void TextLoadObserver::ConnectDestructionSignal()
+{
+ mDestructionSignalConnect++;
+}
+
+bool TextLoadObserver::DisconnectDestructionSignal()
+{
+ mDestructionSignalConnect--;
+ if(mDestructionSignalConnect < 0)
+ {
+ mDestructionSignalConnect = 0;
+ }
+ return !mDestructionSignalConnect;
+}
+
} // namespace Toolkit
} // namespace Dali
*/
DestructionSignalType& DestructionSignal();
+ /**
+ * @brief Each time DestructionSignal is connected, the count increases by 1.
+ */
+ void ConnectDestructionSignal();
+
+ /**
+ * @brief Each time DestructionSignal is disconnected, the count decreases by 1.
+ * @return If the count reaches 0, true is returned.
+ */
+ bool DisconnectDestructionSignal();
+
+public:
+
private:
- DestructionSignalType mDestructionSignal; ///< The destruction signal emitted when the observer is destroyed.
+ DestructionSignalType mDestructionSignal; ///< The destruction signal emitted when the observer is destroyed.
+ int mDestructionSignalConnect; ///< The number of times DestructionSignal is connected.
};
} // namespace Toolkit