Implement LocalReAlloc in PAL
authorstephentoub <stoub@microsoft.com>
Tue, 27 Oct 2015 03:03:04 +0000 (23:03 -0400)
committerstephentoub <stoub@microsoft.com>
Tue, 27 Oct 2015 17:22:25 +0000 (13:22 -0400)
Marshal.ReAllocHGlobal is failing because it's expecting to find a LocalReAlloc implementation in libcoreclr's PAL.  This commit adds one.

src/dlls/mscoree/mscorwks_unixexports.src
src/pal/inc/pal.h
src/pal/src/memory/local.cpp

index bd71c24..67afcb6 100644 (file)
@@ -58,6 +58,7 @@ GetTempFileNameW
 GetTempPathW
 LeaveCriticalSection
 LocalAlloc
+LocalReAlloc
 LocalFree
 LockFile
 lstrlenA
index 6cc9978..8c1608b 100644 (file)
@@ -3944,6 +3944,7 @@ HeapSetInformation(
         IN SIZE_T HeapInformationLength);
 
 #define LMEM_FIXED          0x0000
+#define LMEM_MOVEABLE       0x0002
 #define LMEM_ZEROINIT       0x0040
 #define LPTR                (LMEM_FIXED | LMEM_ZEROINIT)
 
@@ -3957,6 +3958,14 @@ LocalAlloc(
 PALIMPORT
 HLOCAL
 PALAPI
+LocalReAlloc(
+       IN HLOCAL hMem,
+       IN SIZE_T uBytes,
+       IN UINT   uFlags);
+
+PALIMPORT
+HLOCAL
+PALAPI
 LocalFree(
       IN HLOCAL hMem);
 
index c221b20..7a709ef 100644 (file)
@@ -79,6 +79,38 @@ done:
     return (HLOCAL) lpRetVal;
 }
 
+/*++
+Function:
+LocalReAlloc
+
+See MSDN doc.
+--*/
+HLOCAL
+PALAPI
+LocalReAlloc(
+       IN HLOCAL hMem,
+       IN SIZE_T uBytes,
+       IN UINT   uFlags)
+{
+    LPVOID lpRetVal = NULL;
+    PERF_ENTRY(LocalReAlloc);
+    ENTRY("LocalReAlloc (hMem=%p, uBytes=%u, uFlags=%#x)\n", hMem, uBytes, uFlags);
+
+    if (uFlags != LMEM_MOVEABLE) {
+        // Currently valid iff uFlags is LMEM_MOVEABLE
+        ASSERT("Invalid parameter uFlags=0x%x\n", uFlags);
+        SetLastError(ERROR_INVALID_PARAMETER);
+        goto done;
+    }
+    uFlags = 0;
+
+    lpRetVal = HeapReAlloc(GetProcessHeap(), uFlags, hMem, uBytes);
+
+done:
+    LOGEXIT("LocalReAlloc returning %p.\n", lpRetVal);
+    PERF_EXIT(LocalReAlloc);
+    return (HLOCAL)lpRetVal;
+}
 
 /*++
 Function: