Commit e2f9c733 authored by Russ Cox's avatar Russ Cox

runtime: more graceful out-of-memory crash

Used to fault trying to access l->list->next
when l->list == nil after MCentral_AllocList.
Now prints

runtime: out of memory: no room in arena for 65536-byte allocation (536870912 in use)
throw: out of memory

followed by stack trace.

Fixes #1650.

R=r, dfc
CC=golang-dev
https://golang.org/cl/4446062
parent b1deb3be
...@@ -22,6 +22,8 @@ runtime·MCache_Alloc(MCache *c, int32 sizeclass, uintptr size, int32 zeroed) ...@@ -22,6 +22,8 @@ runtime·MCache_Alloc(MCache *c, int32 sizeclass, uintptr size, int32 zeroed)
// Replenish using central lists. // Replenish using central lists.
n = runtime·MCentral_AllocList(&runtime·mheap.central[sizeclass], n = runtime·MCentral_AllocList(&runtime·mheap.central[sizeclass],
runtime·class_to_transfercount[sizeclass], &first); runtime·class_to_transfercount[sizeclass], &first);
if(n == 0)
runtime·throw("out of memory");
l->list = first; l->list = first;
l->nlist = n; l->nlist = n;
c->size += n*size; c->size += n*size;
......
...@@ -180,8 +180,10 @@ MHeap_Grow(MHeap *h, uintptr npage) ...@@ -180,8 +180,10 @@ MHeap_Grow(MHeap *h, uintptr npage)
// Allocate a multiple of 64kB (16 pages). // Allocate a multiple of 64kB (16 pages).
npage = (npage+15)&~15; npage = (npage+15)&~15;
ask = npage<<PageShift; ask = npage<<PageShift;
if(ask > h->arena_end - h->arena_used) if(ask > h->arena_end - h->arena_used) {
runtime·printf("runtime: out of memory: no room in arena for %D-byte allocation (%D in use)\n", (uint64)ask, (uint64)(h->arena_used - h->arena_start));
return false; return false;
}
if(ask < HeapAllocChunk && HeapAllocChunk <= h->arena_end - h->arena_used) if(ask < HeapAllocChunk && HeapAllocChunk <= h->arena_end - h->arena_used)
ask = HeapAllocChunk; ask = HeapAllocChunk;
...@@ -191,9 +193,11 @@ MHeap_Grow(MHeap *h, uintptr npage) ...@@ -191,9 +193,11 @@ MHeap_Grow(MHeap *h, uintptr npage)
ask = npage<<PageShift; ask = npage<<PageShift;
v = runtime·MHeap_SysAlloc(h, ask); v = runtime·MHeap_SysAlloc(h, ask);
} }
if(v == nil) if(v == nil) {
runtime·printf("runtime: out of memory: operating system refused %D-byte allocation\n", (uint64)ask);
return false; return false;
} }
}
mstats.heap_sys += ask; mstats.heap_sys += ask;
// Create a fake "in use" span and free it, so that the // Create a fake "in use" span and free it, so that the
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment