]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix SysFree to really free memory on Windows
authorAlex Brainman <alex.brainman@gmail.com>
Wed, 24 Nov 2010 00:47:35 +0000 (11:47 +1100)
committerAlex Brainman <alex.brainman@gmail.com>
Wed, 24 Nov 2010 00:47:35 +0000 (11:47 +1100)
Fixes #1294.

R=golang-dev, PeterGo, iant
CC=golang-dev
https://golang.org/cl/3271041

src/pkg/runtime/windows/mem.c

index 0b5d56c8bbb71879e83290b287a4cf14f92dbf14..c113c40c32a53e71a9e3ec78b70113eade35b7bf 100644 (file)
@@ -15,10 +15,25 @@ enum {
        PAGE_EXECUTE_READWRITE = 0x40,
 };
 
+static void
+abort(int8 *name)
+{
+       uintptr errno;
+
+       errno = (uintptr)runtime·stdcall(runtime·GetLastError, 0);
+       runtime·printf("%s failed with errno=%d\n", name, errno);
+       runtime·throw(name);
+}
+
 void*
 runtime·SysAlloc(uintptr n)
 {
-       return runtime·stdcall(runtime·VirtualAlloc, 4, nil, n, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
+       void *v;
+
+       v = runtime·stdcall(runtime·VirtualAlloc, 4, nil, n, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
+       if(v == 0)
+               abort("VirtualAlloc");
+       return v;
 }
 
 void
@@ -31,7 +46,11 @@ runtime·SysUnused(void *v, uintptr n)
 void
 runtime·SysFree(void *v, uintptr n)
 {
-       runtime·stdcall(runtime·VirtualFree, 3, v, n, MEM_RELEASE);
+       uintptr r;
+
+       r = (uintptr)runtime·stdcall(runtime·VirtualFree, 3, v, 0, MEM_RELEASE);
+       if(r == 0)
+               abort("VirtualFree");
 }
 
 void