]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix Windows SysUsed
authorRuss Cox <rsc@golang.org>
Fri, 19 Sep 2014 00:41:00 +0000 (20:41 -0400)
committerRuss Cox <rsc@golang.org>
Fri, 19 Sep 2014 00:41:00 +0000 (20:41 -0400)
Same fix as for SysUnused.
Fixes #8038.

LGTM=iant, alex.brainman
R=golang-codereviews, iant, alex.brainman
CC=golang-codereviews
https://golang.org/cl/147820043

src/runtime/mem_windows.c

index 7bc028bf3a5445017c972dc8eebb7bcf99ee4c76..6ea992020cbab517e5bb3973ee7bd144afff3225 100644 (file)
@@ -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