https://git.reactos.org/?p=reactos.git;a=commitdiff;h=dc2d2232f45956cf496b8f80ecb9a4c19d77f7f2

commit dc2d2232f45956cf496b8f80ecb9a4c19d77f7f2
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Sun Dec 10 18:09:59 2023 +0900
Commit:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
CommitDate: Sun Dec 10 18:09:59 2023 +0900

    [SHIMGVW] Use HeapAlloc/HeapFree instead of malloc/calloc/free
    
    malloc/free are slow. CORE-19358
---
 dll/win32/shimgvw/anime.c   | 12 ++++++------
 dll/win32/shimgvw/shimgvw.c | 36 ++++++++++++++++++------------------
 dll/win32/shimgvw/shimgvw.h | 10 ++++++++++
 3 files changed, 34 insertions(+), 24 deletions(-)

diff --git a/dll/win32/shimgvw/anime.c b/dll/win32/shimgvw/anime.c
index 6348c43b903..3b247cfac24 100644
--- a/dll/win32/shimgvw/anime.c
+++ b/dll/win32/shimgvw/anime.c
@@ -13,7 +13,7 @@ void Anime_FreeInfo(PANIME pAnime)
 {
     if (pAnime->m_pDelayItem)
     {
-        free(pAnime->m_pDelayItem);
+        QuickFree(pAnime->m_pDelayItem);
         pAnime->m_pDelayItem = NULL;
     }
     pAnime->m_nFrameIndex = 0;
@@ -101,13 +101,13 @@ BOOL Anime_LoadInfo(PANIME pAnime)
     GdipImageGetFrameDimensionsCount(g_pImage, &nDimCount);
     if (nDimCount)
     {
-        GUID *dims = (GUID *)calloc(nDimCount, sizeof(GUID));
+        GUID *dims = (GUID *)QuickAlloc(nDimCount * sizeof(GUID), TRUE);
         if (dims)
         {
             GdipImageGetFrameDimensionsList(g_pImage, dims, nDimCount);
             GdipImageGetFrameCount(g_pImage, dims, &result);
             pAnime->m_nFrameCount = result;
-            free(dims);
+            QuickFree(dims);
         }
     }
 
@@ -116,7 +116,7 @@ BOOL Anime_LoadInfo(PANIME pAnime)
     cbItem = result;
     if (cbItem)
     {
-        pAnime->m_pDelayItem = (PropertyItem *)malloc(cbItem);
+        pAnime->m_pDelayItem = (PropertyItem *)QuickAlloc(cbItem, FALSE);
         GdipGetPropertyItem(g_pImage, PropertyTagFrameDelay, cbItem, 
pAnime->m_pDelayItem);
     }
 
@@ -125,14 +125,14 @@ BOOL Anime_LoadInfo(PANIME pAnime)
     cbItem = result;
     if (cbItem)
     {
-        PropertyItem *pItem = (PropertyItem *)malloc(cbItem);
+        PropertyItem *pItem = (PropertyItem *)QuickAlloc(cbItem, FALSE);
         if (pItem)
         {
             if (GdipGetPropertyItem(g_pImage, PropertyTagLoopCount, cbItem, 
pItem) == Ok)
             {
                 pAnime->m_nLoopCount = *(WORD *)pItem->value;
             }
-            free(pItem);
+            QuickFree(pItem);
         }
     }
 
diff --git a/dll/win32/shimgvw/shimgvw.c b/dll/win32/shimgvw/shimgvw.c
index 32f944c55a5..82775a85d55 100644
--- a/dll/win32/shimgvw/shimgvw.c
+++ b/dll/win32/shimgvw/shimgvw.c
@@ -243,10 +243,10 @@ static VOID pSaveImageAs(HWND hwnd)
         return;
 
     GdipGetImageEncodersSize(&num, &size);
-    codecInfo = malloc(size);
+    codecInfo = QuickAlloc(size, FALSE);
     if (!codecInfo)
     {
-        DPRINT1("malloc() failed in pSaveImageAs()\n");
+        DPRINT1("QuickAlloc() failed in pSaveImageAs()\n");
         return;
     }
 
@@ -263,11 +263,11 @@ static VOID pSaveImageAs(HWND hwnd)
     /* Add two more chars for the last terminator */
     sizeRemain += (sizeof(WCHAR) * 2);
 
-    szFilterMask = malloc(sizeRemain);
+    szFilterMask = QuickAlloc(sizeRemain, FALSE);
     if (!szFilterMask)
     {
         DPRINT1("cannot allocate memory for filter mask in pSaveImageAs()");
-        free(codecInfo);
+        QuickFree(codecInfo);
         return;
     }
 
@@ -316,8 +316,8 @@ static VOID pSaveImageAs(HWND hwnd)
         Anime_Start(&g_Anime, 0);
     }
 
-    free(szFilterMask);
-    free(codecInfo);
+    QuickFree(szFilterMask);
+    QuickFree(codecInfo);
 }
 
 static VOID
@@ -380,20 +380,20 @@ pBuildFileList(LPCWSTR szFirstFile)
     PathRemoveFileSpecW(szSearchPath);
 
     GdipGetImageDecodersSize(&num, &size);
-    codecInfo = malloc(size);
+    codecInfo = QuickAlloc(size, FALSE);
     if (!codecInfo)
     {
-        DPRINT1("malloc() failed in pLoadFileList()\n");
+        DPRINT1("QuickAlloc() failed in pLoadFileList()\n");
         return NULL;
     }
 
     GdipGetImageDecoders(num, size, codecInfo);
 
-    root = malloc(sizeof(SHIMGVW_FILENODE));
+    root = QuickAlloc(sizeof(SHIMGVW_FILENODE), FALSE);
     if (!root)
     {
-        DPRINT1("malloc() failed in pLoadFileList()\n");
-        free(codecInfo);
+        DPRINT1("QuickAlloc() failed in pLoadFileList()\n");
+        QuickFree(codecInfo);
         return NULL;
     }
 
@@ -422,18 +422,18 @@ pBuildFileList(LPCWSTR szFirstFile)
                         currentNode = conductor;
                     }
 
-                    conductor->Next = malloc(sizeof(SHIMGVW_FILENODE));
+                    conductor->Next = QuickAlloc(sizeof(SHIMGVW_FILENODE), 
FALSE);
 
-                    // if malloc fails, make circular what we have and return 
it
+                    // if QuickAlloc fails, make circular what we have and 
return it
                     if (!conductor->Next)
                     {
-                        DPRINT1("malloc() failed in pLoadFileList()\n");
+                        DPRINT1("QuickAlloc() failed in pLoadFileList()\n");
 
                         conductor->Next = root;
                         root->Prev = conductor;
 
                         FindClose(hFindHandle);
-                        free(codecInfo);
+                        QuickFree(codecInfo);
                         return conductor;
                     }
 
@@ -459,7 +459,7 @@ pBuildFileList(LPCWSTR szFirstFile)
     else
     {
         conductor = conductor->Prev;
-        free(conductor->Next);
+        QuickFree(conductor->Next);
     }
 
     // link the last node with the first one to make the list circular
@@ -467,7 +467,7 @@ pBuildFileList(LPCWSTR szFirstFile)
     root->Prev = conductor;
     conductor = currentNode;
 
-    free(codecInfo);
+    QuickFree(codecInfo);
 
     return conductor;
 }
@@ -487,7 +487,7 @@ pFreeFileList(SHIMGVW_FILENODE *root)
     {
         conductor = root;
         root = conductor->Next;
-        free(conductor);
+        QuickFree(conductor);
     }
 }
 
diff --git a/dll/win32/shimgvw/shimgvw.h b/dll/win32/shimgvw/shimgvw.h
index 99a159a4cd1..a9a7b7b8daa 100644
--- a/dll/win32/shimgvw/shimgvw.h
+++ b/dll/win32/shimgvw/shimgvw.h
@@ -72,3 +72,13 @@ void Anime_SetFrameIndex(PANIME pAnime, UINT nFrameIndex);
 void Anime_Start(PANIME pAnime, DWORD dwDelay);
 void Anime_Pause(PANIME pAnime);
 BOOL Anime_OnTimer(PANIME pAnime, WPARAM wParam);
+
+static inline LPVOID QuickAlloc(SIZE_T cbSize, BOOL bZero)
+{
+    return HeapAlloc(GetProcessHeap(), (bZero ? HEAP_ZERO_MEMORY : 0), cbSize);
+}
+
+static inline VOID QuickFree(LPVOID ptr)
+{
+    HeapFree(GetProcessHeap(), 0, ptr);
+}

Reply via email to