Commit 7bcbdbd9 authored by Dmitriy Vyukov's avatar Dmitriy Vyukov

runtime: pass correct size to malloc

In both cases we lie to malloc about the actual size that we need.
In panic we ask for less memory than we are going to use.
In slice we ask for more memory than we are going to use
(potentially asking for a fractional number of elements).
This breaks the new GC.

LGTM=khr
R=golang-codereviews, dave, khr
CC=golang-codereviews, rsc
https://golang.org/cl/116940043
parent 92c54e4a
...@@ -41,7 +41,7 @@ newdefer(int32 siz) ...@@ -41,7 +41,7 @@ newdefer(int32 siz)
} }
if(d == nil) { if(d == nil) {
// deferpool is empty or just a big defer // deferpool is empty or just a big defer
total = TOTALSIZE(siz); total = runtime·roundupsize(TOTALSIZE(siz));
d = runtime·malloc(total); d = runtime·malloc(total);
} }
d->siz = siz; d->siz = siz;
......
...@@ -117,14 +117,18 @@ growslice1(SliceType *t, Slice x, intgo newcap, Slice *ret) ...@@ -117,14 +117,18 @@ growslice1(SliceType *t, Slice x, intgo newcap, Slice *ret)
if(newcap1 > MaxMem/typ->size) if(newcap1 > MaxMem/typ->size)
runtime·panicstring("growslice: cap out of range"); runtime·panicstring("growslice: cap out of range");
// Try to use all memory that malloc will give us...
capmem = runtime·roundupsize(newcap1*typ->size); capmem = runtime·roundupsize(newcap1*typ->size);
// ...but don't ask for fractional number of elements (that can confuse GC).
newcap1 = capmem/typ->size;
capmem = newcap1*typ->size;
flag = 0; flag = 0;
// Can't use FlagNoZero w/o FlagNoScan, because otherwise GC can scan unitialized memory. // Can't use FlagNoZero w/o FlagNoScan, because otherwise GC can scan unitialized memory.
if(typ->kind&KindNoPointers) if(typ->kind&KindNoPointers)
flag = FlagNoScan|FlagNoZero; flag = FlagNoScan|FlagNoZero;
ret->array = runtime·mallocgc(capmem, (uintptr)typ|TypeInfo_Array, flag); ret->array = runtime·mallocgc(capmem, (uintptr)typ|TypeInfo_Array, flag);
ret->len = x.len; ret->len = x.len;
ret->cap = capmem/typ->size; ret->cap = newcap1;
lenmem = x.len*typ->size; lenmem = x.len*typ->size;
runtime·memmove(ret->array, x.array, lenmem); runtime·memmove(ret->array, x.array, lenmem);
if(typ->kind&KindNoPointers) if(typ->kind&KindNoPointers)
......
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