Refactor to remove ControlRenderer::mCachedRenderer member. 26/49226/4
authorChu Hoang <c.hoang@samsung.com>
Fri, 9 Oct 2015 09:05:44 +0000 (10:05 +0100)
committerChu Hoang <c.hoang@samsung.com>
Mon, 12 Oct 2015 14:40:06 +0000 (15:40 +0100)
Change-Id: I4ba5ccc62b5de25a76f21401b3914efa06a41649

dali-toolkit/internal/controls/renderers/control-renderer-data-impl.h
dali-toolkit/internal/controls/renderers/control-renderer-impl.cpp
dali-toolkit/internal/controls/renderers/renderer-factory-cache.cpp
dali-toolkit/internal/controls/renderers/renderer-factory-cache.h

index c080be2..c616669 100644 (file)
@@ -48,7 +48,6 @@ struct Internal::ControlRenderer::Impl
   };
 
   std::string mCachedRendererKey;  ///< The key to use for caching of the renderer. If it is empty then no caching will occur
   };
 
   std::string mCachedRendererKey;  ///< The key to use for caching of the renderer. If it is empty then no caching will occur
-  RendererFactoryCache::CachedRendererPtr mCachedRenderer; ///< The current cached renderer from the Factory Cache. mCachedRenderer == null whilst this control render is offstage
   Renderer mRenderer;
 
   CustomShader* mCustomShader;
   Renderer mRenderer;
 
   CustomShader* mCustomShader;
index 18374e1..990182c 100644 (file)
@@ -133,19 +133,15 @@ void ControlRenderer::SetCachedRendererKey( const std::string& cachedRendererKey
   }
   else
   {
   }
   else
   {
-    //remove the cached renderer from the cache if we and the cache are the only things that hold a reference to it
-    if( mImpl->mCachedRenderer && mImpl->mCachedRenderer->ReferenceCount() == 2 )
-    {
-      mFactoryCache.RemoveRenderer( mImpl->mCachedRenderer->mKey );
-    }
-    mImpl->mCachedRenderer.Reset();
+    //clean the renderer from the cache since it may no longer be in use
+    mFactoryCache.CleanRendererCache( mImpl->mCachedRendererKey );
 
     //add the new renderer
     mImpl->mCachedRendererKey = cachedRendererKey;
     if( !mImpl->mCachedRendererKey.empty() && !mImpl->mCustomShader )
     {
       DALI_ASSERT_DEBUG( mImpl->mRenderer && "The control render is on stage but it doesn't have a valid renderer.");
 
     //add the new renderer
     mImpl->mCachedRendererKey = cachedRendererKey;
     if( !mImpl->mCachedRendererKey.empty() && !mImpl->mCustomShader )
     {
       DALI_ASSERT_DEBUG( mImpl->mRenderer && "The control render is on stage but it doesn't have a valid renderer.");
-      mImpl->mCachedRenderer = mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer );
+      mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer );
     }
   }
 }
     }
   }
 }
@@ -154,16 +150,11 @@ void ControlRenderer::SetOnStage( Actor& actor )
 {
   if( !mImpl->mCachedRendererKey.empty() && !mImpl->mCustomShader )
   {
 {
   if( !mImpl->mCachedRendererKey.empty() && !mImpl->mCustomShader )
   {
-    mImpl->mCachedRenderer = mFactoryCache.GetRenderer( mImpl->mCachedRendererKey );
-    if( !mImpl->mCachedRenderer || !mImpl->mCachedRenderer->mRenderer )
+    mImpl->mRenderer = mFactoryCache.GetRenderer( mImpl->mCachedRendererKey );
+    if( !mImpl->mRenderer )
     {
       InitializeRenderer( mImpl->mRenderer );
     {
       InitializeRenderer( mImpl->mRenderer );
-      mImpl->mCachedRenderer = mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer );
-    }
-
-    if( mImpl->mCachedRenderer && mImpl->mCachedRenderer->mRenderer )
-    {
-      mImpl->mRenderer = mImpl->mCachedRenderer->mRenderer;
+      mFactoryCache.SaveRenderer( mImpl->mCachedRendererKey, mImpl->mRenderer );
     }
   }
 
     }
   }
 
@@ -184,17 +175,12 @@ void ControlRenderer::SetOffStage( Actor& actor )
   if( mImpl->mIsOnStage )
   {
     DoSetOffStage( actor );
   if( mImpl->mIsOnStage )
   {
     DoSetOffStage( actor );
-
-    //remove the cached renderer from the cache if we and the cache are the only things that hold a reference to it
-    if( mImpl->mCachedRenderer && mImpl->mCachedRenderer->ReferenceCount() == 2 )
-    {
-      mFactoryCache.RemoveRenderer( mImpl->mCachedRenderer->mKey );
-    }
-    mImpl->mCachedRenderer.Reset();
-
     actor.RemoveRenderer( mImpl->mRenderer );
     mImpl->mRenderer.Reset();
 
     actor.RemoveRenderer( mImpl->mRenderer );
     mImpl->mRenderer.Reset();
 
+    //clean the renderer from the cache since it may no longer be in use
+    mFactoryCache.CleanRendererCache( mImpl->mCachedRendererKey );
+
     mImpl->mIsOnStage = false;
   }
 }
     mImpl->mIsOnStage = false;
   }
 }
index a22f541..c7b53b6 100644 (file)
@@ -73,7 +73,7 @@ int RendererFactoryCache::FindRenderer( const std::string& key ) const
     if( it != mRendererHashes.End() )
     {
       int index = it - mRendererHashes.Begin();
     if( it != mRendererHashes.End() )
     {
       int index = it - mRendererHashes.Begin();
-      const CachedRendererPtr& cachedRenderer = mRenderers[ index ];
+      const CachedRenderer* cachedRenderer = mRenderers[ index ];
 
       if( cachedRenderer && cachedRenderer->mKey == key )
       {
 
       if( cachedRenderer && cachedRenderer->mKey == key )
       {
@@ -90,47 +90,51 @@ int RendererFactoryCache::FindRenderer( const std::string& key ) const
   return -1;
 }
 
   return -1;
 }
 
-RendererFactoryCache::CachedRendererPtr RendererFactoryCache::GetRenderer( const std::string& key ) const
+Renderer RendererFactoryCache::GetRenderer( const std::string& key ) const
 {
   int index = FindRenderer( key );
   if( index != -1 )
   {
 {
   int index = FindRenderer( key );
   if( index != -1 )
   {
-    return mRenderers[ index ];
+    return mRenderers[ index ]->mRenderer.GetHandle();
   }
   else
   {
   }
   else
   {
-    return CachedRendererPtr();
+    return Renderer();
   }
 }
 
   }
 }
 
-RendererFactoryCache::CachedRendererPtr RendererFactoryCache::SaveRenderer( const std::string& key, Renderer& renderer )
+void RendererFactoryCache::SaveRenderer( const std::string& key, Renderer& renderer )
 {
   int hash = Dali::CalculateHash( key );
 {
   int hash = Dali::CalculateHash( key );
-  CachedRendererPtr newCachedRenderer = new CachedRenderer( key, renderer );
+  const CachedRenderer* cachedRenderer = new CachedRenderer( key, renderer );
 
 
-  CachedRenderers::iterator it = std::find(mRenderers.begin(), mRenderers.end(), CachedRendererPtr() );
-  if( it != mRenderers.end() )
+  CachedRenderers::Iterator it = std::find( mRenderers.Begin(), mRenderers.End(), static_cast< CachedRenderer* >( NULL ) );
+  if( it != mRenderers.End() )
   {
   {
-    *it = newCachedRenderer;
-    int index = it - mRenderers.begin();
+    *it = cachedRenderer;
+    int index = it - mRenderers.Begin();
     mRendererHashes[ index ] = hash;
   }
   else
   {
     mRendererHashes.PushBack( hash );
     mRendererHashes[ index ] = hash;
   }
   else
   {
     mRendererHashes.PushBack( hash );
-    mRenderers.push_back( newCachedRenderer );
+    mRenderers.PushBack( cachedRenderer );
   }
   }
-
-  return newCachedRenderer;
 }
 
 }
 
-void RendererFactoryCache::RemoveRenderer( const std::string& key )
+void RendererFactoryCache::CleanRendererCache( const std::string& key )
 {
   int index = FindRenderer( key );
   if( index != -1 )
   {
 {
   int index = FindRenderer( key );
   if( index != -1 )
   {
-    mRendererHashes[ index ] = Dali::CalculateHash( "" );
-    mRenderers[ index ].Reset();
+    const CachedRenderer*& cachedRenderer = mRenderers[ index ];
+    if( !cachedRenderer->mRenderer.GetHandle() )
+    {
+      mRendererHashes[ index ] = Dali::INITIAL_HASH_VALUE;
+
+      delete cachedRenderer;
+      cachedRenderer = NULL;
+    }
   }
 }
 
   }
 }
 
index f546c85..947fd47 100644 (file)
@@ -24,6 +24,9 @@
 #include <dali/devel-api/rendering/geometry.h>
 #include <dali/devel-api/rendering/shader.h>
 #include <dali/devel-api/rendering/renderer.h>
 #include <dali/devel-api/rendering/geometry.h>
 #include <dali/devel-api/rendering/shader.h>
 #include <dali/devel-api/rendering/renderer.h>
+#include <dali/devel-api/common/owner-container.h>
+#include <dali/devel-api/object/weak-handle.h>
+
 
 namespace Dali
 {
 
 namespace Dali
 {
@@ -110,25 +113,13 @@ public:
   static Geometry CreateQuadGeometry();
 
 public:
   static Geometry CreateQuadGeometry();
 
 public:
-  struct CachedRenderer : RefObject
-  {
-    std::string mKey;
-    Renderer mRenderer;
-
-    CachedRenderer( const std::string& key, const Renderer& renderer )
-    : mKey( key ),
-      mRenderer( renderer )
-    {}
-  };
-
-  typedef IntrusivePtr< CachedRenderer > CachedRendererPtr;
 
   /**
    * @brief Request renderer from the url
    *
 
   /**
    * @brief Request renderer from the url
    *
-   * @return The cached renderer if exist in the cache. Otherwise null is returned.
+   * @return The cached renderer if exist in the cache. Otherwise an empty handle is returned.
    */
    */
-  CachedRendererPtr GetRenderer( const std::string& key ) const;
+  Renderer GetRenderer( const std::string& key ) const;
 
   /**
    * @brief Cache the renderer based on the given key.
 
   /**
    * @brief Cache the renderer based on the given key.
@@ -138,17 +129,15 @@ public:
    *
    * @param[in] key The key to use for caching
    * @param[in] renderer The Renderer to be cached
    *
    * @param[in] key The key to use for caching
    * @param[in] renderer The Renderer to be cached
-   *
-   * @return The cached renderer stored in the cache
    */
    */
-  CachedRendererPtr SaveRenderer( const std::string& key, Renderer& renderer );
+  void SaveRenderer( const std::string& key, Renderer& renderer );
 
   /**
 
   /**
-   * @brief Removes the renderer from the cache based on the given key
+   * @brief Cleans the renderer cache by removing the renderer from the cache based on the given key if there are no longer any references to it
    *
    * @param[in] key The key used for caching
    */
    *
    * @param[in] key The key used for caching
    */
-  void RemoveRenderer( const std::string& key );
+  void CleanRendererCache( const std::string& key );
 
 protected:
 
 
 protected:
 
@@ -168,8 +157,19 @@ protected:
   RendererFactoryCache& operator=(const RendererFactoryCache& rhs);
 
 private:
   RendererFactoryCache& operator=(const RendererFactoryCache& rhs);
 
 private:
+  struct CachedRenderer
+  {
+    std::string mKey;
+    WeakHandle< Renderer > mRenderer;
+
+    CachedRenderer( const std::string& key, Renderer& renderer )
+    : mKey( key ),
+      mRenderer( renderer)
+    {}
+  };
+
   typedef Dali::Vector< std::size_t > HashVector;
   typedef Dali::Vector< std::size_t > HashVector;
-  typedef std::vector< CachedRendererPtr > CachedRenderers;
+  typedef Dali::OwnerContainer< const CachedRenderer* > CachedRenderers;
 
   /**
    * @brief Finds the first index into the cached renderers from the url
 
   /**
    * @brief Finds the first index into the cached renderers from the url