Optimize memory allocates in metarecords

Warren_Baird at cimmetry.com Warren_Baird at cimmetry.com
Wed Feb 5 17:35:07 CST 2003



ChangeLog:

     Avoid excessive heap memory reallocation when playing Windows
     metarecords in memory.

Description:

     Keep track of previously allocated memory size in the METAFILEDRV_PDEVICE
     structure to avoid useless and expensive heap reallocation each time
     a metarecord is written in memory.

Warren Baird : Warren_Baird at cimmetry.com
Xavier Servettaz

diff -ur clean/wine/dlls/gdi/mfdrv/metafiledrv.h
wine/dlls/gdi/mfdrv/metafiledrv.h
--- clean/wine/dlls/gdi/mfdrv/metafiledrv.h   Wed Jan 29 15:30:25 2003
+++ wine/dlls/gdi/mfdrv/metafiledrv.h    Fri Jan 31 16:29:32 2003
@@ -34,6 +34,7 @@
     METAHEADER  *mh;           /* Pointer to metafile header */
     UINT       nextHandle;     /* Next handle number */
     HANDLE     hFile;          /* Handle for disk based MetaFile */
+    size_t     allocatedSize;  /* size of allocated memory */
 } METAFILEDRV_PDEVICE;


diff -ur clean/wine/dlls/gdi/mfdrv/init.c  wine/dlls/gdi/mfdrv/init.c
--- clean/wine/dlls/gdi/mfdrv/init.c     Wed Jan 29 15:30:25 2003
+++ wine/dlls/gdi/mfdrv/init.c     Fri Jan 31 16:25:48 2003
@@ -184,6 +184,8 @@
     physDev->mh->mtMaxRecord    = 0;
     physDev->mh->mtNoParameters = 0;

+    physDev->allocatedSize = 2 * physDev->mh->mtSize;
+
     return dc;
 }

@@ -382,9 +384,22 @@
     {
     case METAFILE_MEMORY:
     len = physDev->mh->mtSize * 2 + rlen;
-    mh = HeapReAlloc( GetProcessHeap(), 0, physDev->mh, len );
-        if (!mh) return FALSE;
-        physDev->mh = mh;
+    /* reallocate memory if needed */
+    if (len > physDev->allocatedSize){
+        if (!physDev->allocatedSize) {
+             ERR("Unable to write record to unallocated memory\n");
+              return FALSE;
+         }
+         /*expand size*/
+         physDev->allocatedSize = (size_t)(1.2* physDev->allocatedSize + rlen);
+         mh = HeapReAlloc( GetProcessHeap(), 0, physDev->mh,
physDev->allocatedSize);
+         if (!mh) {
+             ERR("Unable to Reallocate Heap memory\n");
+              return FALSE;
+         }
+         physDev->mh = mh;
+         TRACE("Reallocated metafile: new size is
%d\n",physDev->allocatedSize);
+    }
     memcpy((WORD *)physDev->mh + physDev->mh->mtSize, mr, rlen);
         break;
     case METAFILE_DISK:





More information about the wine-patches mailing list