Fix memory leak issue when we load svg synchronously 77/319577/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Mon, 28 Oct 2024 02:39:54 +0000 (11:39 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Mon, 28 Oct 2024 02:46:47 +0000 (11:46 +0900)
Since auto keyword don't support to using IntrusivePtr automatically,
we should specify the name of class.

Without this keyword, the class that created by new keyword never be removed.

Change-Id: I60446dd4ed011f0710cee57f44a1770d154aaca0
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali-toolkit/internal/visuals/svg/svg-loader.cpp

index 12d9596bf43a9c01193c3ea6abd2d1bb80b6c27f..672deb668cf4b8aad5a315db04e85f8613393709 100644 (file)
@@ -691,7 +691,7 @@ void SvgLoader::LoadSynchronously(SvgLoader::SvgLoadInfo& loadInfo, SvgLoaderObs
   }
 
   // Note, we will not store this task after this API called.
-  auto loadingTask = new SvgLoadingTask(loadInfo.mVectorImageRenderer, loadInfo.mId, loadInfo.mImageUrl, encodedImageBuffer, loadInfo.mDpi, nullptr);
+  SvgTaskPtr loadingTask = new SvgLoadingTask(loadInfo.mVectorImageRenderer, loadInfo.mId, loadInfo.mImageUrl, encodedImageBuffer, loadInfo.mDpi, nullptr);
   loadingTask->Process();
   if(!loadingTask->HasSucceeded())
   {
@@ -882,11 +882,17 @@ void SvgLoader::RasterizeRequest(SvgLoader::SvgRasterizeInfo& rasterizeInfo, Svg
 
   auto vectorImageRenderer = GetVectorImageRenderer(rasterizeInfo.mLoadId);
 
-  auto rasterizingTask = new SvgRasterizingTask(vectorImageRenderer, rasterizeInfo.mId, rasterizeInfo.mWidth, rasterizeInfo.mHeight, MakeCallback(this, &SvgLoader::AsyncRasterizeComplete));
+  SvgTaskPtr rasterizingTask = new SvgRasterizingTask(vectorImageRenderer, rasterizeInfo.mId, rasterizeInfo.mWidth, rasterizeInfo.mHeight, MakeCallback(this, &SvgLoader::AsyncRasterizeComplete));
 #ifdef TRACE_ENABLED
   {
-    auto loadCacheIndex = GetCacheIndexFromLoadCacheById(rasterizeInfo.mLoadId);
-    rasterizingTask->SetUrl(mLoadCache[loadCacheIndex].mImageUrl);
+    SvgRasterizingTask* castedRasterizingTask = dynamic_cast<SvgRasterizingTask*>(rasterizingTask.Get());
+
+    // It should not be nullptr, but we need to check nullptr to avoid SVACE false alarm.
+    if(DALI_LIKELY(castedRasterizingTask))
+    {
+      auto loadCacheIndex = GetCacheIndexFromLoadCacheById(rasterizeInfo.mLoadId);
+      castedRasterizingTask->SetUrl(mLoadCache[loadCacheIndex].mImageUrl);
+    }
   }
 #endif
 
@@ -903,11 +909,17 @@ void SvgLoader::RasterizeSynchronously(SvgLoader::SvgRasterizeInfo& rasterizeInf
   auto vectorImageRenderer = GetVectorImageRenderer(rasterizeInfo.mLoadId);
 
   // Note, we will not store this task after this API called.
-  auto rasterizingTask = new SvgRasterizingTask(vectorImageRenderer, rasterizeInfo.mId, rasterizeInfo.mWidth, rasterizeInfo.mHeight, nullptr);
+  SvgTaskPtr rasterizingTask = new SvgRasterizingTask(vectorImageRenderer, rasterizeInfo.mId, rasterizeInfo.mWidth, rasterizeInfo.mHeight, nullptr);
 #ifdef TRACE_ENABLED
   {
-    auto loadCacheIndex = GetCacheIndexFromLoadCacheById(rasterizeInfo.mLoadId);
-    rasterizingTask->SetUrl(mLoadCache[loadCacheIndex].mImageUrl);
+    SvgRasterizingTask* castedRasterizingTask = dynamic_cast<SvgRasterizingTask*>(rasterizingTask.Get());
+
+    // It should not be nullptr, but we need to check nullptr to avoid SVACE false alarm.
+    if(DALI_LIKELY(castedRasterizingTask))
+    {
+      auto loadCacheIndex = GetCacheIndexFromLoadCacheById(rasterizeInfo.mLoadId);
+      castedRasterizingTask->SetUrl(mLoadCache[loadCacheIndex].mImageUrl);
+    }
   }
 #endif
   rasterizingTask->Process();