Merge "Remove NPatchLoader observer when they request remove" into devel/master
authorEunki Hong <eunkiki.hong@samsung.com>
Mon, 25 Sep 2023 05:15:17 +0000 (05:15 +0000)
committerGerrit Code Review <gerrit@review>
Mon, 25 Sep 2023 05:15:17 +0000 (05:15 +0000)
dali-toolkit/internal/visuals/npatch-data.cpp
dali-toolkit/internal/visuals/npatch-loader.cpp

index 62c706e..5c0c474 100644 (file)
@@ -68,27 +68,33 @@ NPatchData::NPatchDataId NPatchData::GetId() const
 
 void NPatchData::AddObserver(TextureUploadObserver* textureObserver)
 {
-  if(mObserverNotifying)
-  {
-    // Do not add it into observer list during observer notifying.
-    mQueuedObservers.PushBack(textureObserver);
-  }
-  else
+  if(textureObserver)
   {
-    mObserverList.PushBack(textureObserver);
+    if(mObserverNotifying)
+    {
+      // Do not add it into observer list during observer notifying.
+      mQueuedObservers.PushBack(textureObserver);
+    }
+    else
+    {
+      mObserverList.PushBack(textureObserver);
+    }
+    textureObserver->DestructionSignal().Connect(this, &NPatchData::ObserverDestroyed);
   }
-  textureObserver->DestructionSignal().Connect(this, &NPatchData::ObserverDestroyed);
 }
 
 void NPatchData::RemoveObserver(TextureUploadObserver* textureObserver)
 {
-  for(uint32_t index = 0; index < mObserverList.Count(); ++index)
+  if(textureObserver)
   {
-    if(textureObserver == mObserverList[index])
+    for(uint32_t index = 0; index < mObserverList.Count(); ++index)
     {
-      textureObserver->DestructionSignal().Disconnect(this, &NPatchData::ObserverDestroyed);
-      mObserverList.Erase(mObserverList.begin() + index);
-      break;
+      if(textureObserver == mObserverList[index])
+      {
+        textureObserver->DestructionSignal().Disconnect(this, &NPatchData::ObserverDestroyed);
+        mObserverList.Erase(mObserverList.begin() + index);
+        break;
+      }
     }
   }
 }
index 3e18482..2151822 100644 (file)
@@ -141,7 +141,19 @@ bool NPatchLoader::GetNPatchData(const NPatchData::NPatchDataId id, const NPatch
 
 void NPatchLoader::RequestRemove(NPatchData::NPatchDataId id, TextureUploadObserver* textureObserver)
 {
-  mRemoveQueue.push_back({id, textureObserver});
+  // Remove observer first
+  if(textureObserver)
+  {
+    int32_t cacheIndex = GetCacheIndexFromId(id);
+    if(cacheIndex != INVALID_CACHE_INDEX)
+    {
+      NPatchInfo& info(mCache[cacheIndex]);
+
+      info.mData->RemoveObserver(textureObserver);
+    }
+  }
+
+  mRemoveQueue.push_back({id, nullptr});
 
   if(!mRemoveProcessorRegistered && Adaptor::IsAvailable())
   {