aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlex Brainman <alex.brainman@gmail.com>2010-11-24 11:47:35 +1100
committerAlex Brainman <alex.brainman@gmail.com>2010-11-24 11:47:35 +1100
commit4e69976a60dc572a48eec7ce0ce2c37436f592e0 (patch)
treec61a7278e644ce016803b8c6240862dcd1f97002
parent86cdbfb5eb391d5ac99c406cb736a7610ef093c0 (diff)
downloadgo-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.c23
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