Ensure a FrameCallback is removed properly from a FrameCallbackInterface 71/265971/3
authorAdeel Kazmi <adeel.kazmi@samsung.com>
Tue, 2 Nov 2021 18:56:41 +0000 (18:56 +0000)
committerAdeel Kazmi <adeel.kazmi@samsung.com>
Wed, 3 Nov 2021 11:54:19 +0000 (11:54 +0000)
Change-Id: Ib24a383db0512ea757e06137433aef9419b84a5b

dali/internal/update/manager/scene-graph-frame-callback.cpp
dali/internal/update/manager/scene-graph-frame-callback.h

index 924e7e9..6e1bd5e 100644 (file)
@@ -42,13 +42,7 @@ FrameCallback::~FrameCallback()
     mUpdateProxy->GetRootNode().RemoveObserver(*this);
   }
 
-  {
-    Mutex::ScopedLock lock(mMutex);
-    if(mFrameCallbackInterface)
-    {
-      FrameCallbackInterface::Impl::Get(*mFrameCallbackInterface).DisconnectFromSceneGraphObject();
-    }
-  }
+  Invalidate();
 }
 
 void FrameCallback::ConnectToSceneGraph(UpdateManager& updateManager, TransformManager& transformManager, Node& rootNode)
@@ -70,7 +64,7 @@ bool FrameCallback::Update(BufferIndex bufferIndex, float elapsedSeconds, bool n
     }
 
     Mutex::ScopedLock lock(mMutex);
-    if(mFrameCallbackInterface)
+    if(mFrameCallbackInterface && mValid)
     {
       Dali::UpdateProxy updateProxy(*mUpdateProxy);
       mFrameCallbackInterface->Update(updateProxy, elapsedSeconds);
@@ -83,10 +77,11 @@ bool FrameCallback::Update(BufferIndex bufferIndex, float elapsedSeconds, bool n
 void FrameCallback::Invalidate()
 {
   Mutex::ScopedLock lock(mMutex);
-  if(mFrameCallbackInterface)
+  if(mFrameCallbackInterface && mValid)
   {
     FrameCallbackInterface::Impl::Get(*mFrameCallbackInterface).DisconnectFromSceneGraphObject();
-    mFrameCallbackInterface = nullptr;
+    mValid = false;
+    // Do not set mFrameCallbackInterface to nullptr as it is used for comparison checks by the comparison operator
   }
 }
 
index f09befa..4d3a061 100644 (file)
@@ -132,6 +132,7 @@ private:
   Mutex                        mMutex;
   std::unique_ptr<UpdateProxy> mUpdateProxy{nullptr}; ///< A unique pointer to the implementation of the UpdateProxy.
   FrameCallbackInterface*      mFrameCallbackInterface;
+  bool                         mValid{true}; ///< Set to false when Invalidate() is called.
 };
 
 /**