]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: correct out of memory error
authorRuss Cox <rsc@golang.org>
Mon, 25 Apr 2011 16:13:54 +0000 (12:13 -0400)
committerRuss Cox <rsc@golang.org>
Mon, 25 Apr 2011 16:13:54 +0000 (12:13 -0400)
Fixes #1511.

R=golang-dev, iant2
CC=golang-dev
https://golang.org/cl/4433065

src/pkg/runtime/darwin/mem.c
src/pkg/runtime/freebsd/mem.c
src/pkg/runtime/linux/mem.c

index cbae187180d2a4de9a2000d8abd5604cc55d8c7a..935c032bc088924570ee4d944b528bc98d70f7f8 100644 (file)
@@ -36,6 +36,11 @@ runtime·SysReserve(void *v, uintptr n)
        return runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0);
 }
 
+enum
+{
+       ENOMEM = 12,
+};
+
 void
 runtime·SysMap(void *v, uintptr n)
 {
@@ -43,6 +48,8 @@ runtime·SysMap(void *v, uintptr n)
        
        mstats.sys += n;
        p = runtime·mmap(v, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_FIXED|MAP_PRIVATE, -1, 0);
+       if(p == (void*)-ENOMEM)
+               runtime·throw("runtime: out of memory");
        if(p != v)
                runtime·throw("runtime: cannot map pages in arena address space");
 }
index f80439e38fd810ae9e0299a31dcf406f5a6142e0..07abf2cfe0556d0fac643922cc7d8a7a90216a53 100644 (file)
@@ -42,6 +42,11 @@ runtime·SysReserve(void *v, uintptr n)
        return runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0);
 }
 
+enum
+{
+       ENOMEM = 12,
+};
+
 void
 runtime·SysMap(void *v, uintptr n)
 {
@@ -52,6 +57,8 @@ runtime·SysMap(void *v, uintptr n)
        // On 64-bit, we don't actually have v reserved, so tread carefully.
        if(sizeof(void*) == 8) {
                p = runtime·mmap(v, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, -1, 0);
+               if(p == (void*)-ENOMEM)
+                       runtime·throw("runtime: out of memory");
                if(p != v) {
                        runtime·printf("runtime: address space conflict: map(%p) = %p\n", v, p);
                        runtime·throw("runtime: address space conflict");
@@ -60,6 +67,8 @@ runtime·SysMap(void *v, uintptr n)
        }
 
        p = runtime·mmap(v, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_FIXED|MAP_PRIVATE, -1, 0);
+       if(p == (void*)-ENOMEM)
+               runtime·throw("runtime: out of memory");
        if(p != v)
                runtime·throw("runtime: cannot map pages in arena address space");
 }
index d2f6f82046ba88acd1ef9b266c28ae6eeaeecef0..ce1a8aa70b26582d425ef35f51dac0ad5d709485 100644 (file)
@@ -48,6 +48,11 @@ runtime·SysReserve(void *v, uintptr n)
        return runtime·mmap(v, n, PROT_NONE, MAP_ANON|MAP_PRIVATE, -1, 0);
 }
 
+enum
+{
+       ENOMEM = 12,
+};
+
 void
 runtime·SysMap(void *v, uintptr n)
 {
@@ -66,6 +71,8 @@ runtime·SysMap(void *v, uintptr n)
        }
 
        p = runtime·mmap(v, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_FIXED|MAP_PRIVATE, -1, 0);
+       if(p == (void*)-ENOMEM)
+               runtime·throw("runtime: out of memory");
        if(p != v)
                runtime·throw("runtime: cannot map pages in arena address space");
 }