summaryrefslogtreecommitdiff
path: root/src/runtime/mem_windows.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/mem_windows.c')
-rw-r--r--src/runtime/mem_windows.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/runtime/mem_windows.c b/src/runtime/mem_windows.c
index 7bc028bf3..6ea992020 100644
--- a/src/runtime/mem_windows.c
+++ b/src/runtime/mem_windows.c
@@ -68,10 +68,22 @@ void
runtime·SysUsed(void *v, uintptr n)
{
void *r;
+ uintptr small;
r = runtime·stdcall4(runtime·VirtualAlloc, (uintptr)v, n, MEM_COMMIT, PAGE_READWRITE);
if(r != v)
runtime·throw("runtime: failed to commit pages");
+
+ // Commit failed. See SysUnused.
+ while(n > 0) {
+ small = n;
+ while(small >= 4096 && runtime·stdcall4(runtime·VirtualAlloc, (uintptr)v, small, MEM_COMMIT, PAGE_READWRITE) == nil)
+ small = (small / 2) & ~(4096-1);
+ if(small < 4096)
+ runtime·throw("runtime: failed to decommit pages");
+ v = (byte*)v + small;
+ n -= small;
+ }
}
void