diff options
author | Alex Brainman <alex.brainman@gmail.com> | 2010-11-24 11:47:35 +1100 |
---|---|---|
committer | Alex Brainman <alex.brainman@gmail.com> | 2010-11-24 11:47:35 +1100 |
commit | 4e69976a60dc572a48eec7ce0ce2c37436f592e0 (patch) | |
tree | c61a7278e644ce016803b8c6240862dcd1f97002 | |
parent | 86cdbfb5eb391d5ac99c406cb736a7610ef093c0 (diff) | |
download | go-4e69976a60dc572a48eec7ce0ce2c37436f592e0.tar.gz go-4e69976a60dc572a48eec7ce0ce2c37436f592e0.zip |
runtime: fix SysFree to really free memory on Windows
Fixes #1294.
R=golang-dev, PeterGo, iant
CC=golang-dev
https://golang.org/cl/3271041
-rw-r--r-- | src/pkg/runtime/windows/mem.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/pkg/runtime/windows/mem.c b/src/pkg/runtime/windows/mem.c index 0b5d56c8bb..c113c40c32 100644 --- a/src/pkg/runtime/windows/mem.c +++ b/src/pkg/runtime/windows/mem.c @@ -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 |