aboutsummaryrefslogtreecommitdiff
path: root/src/pkg/runtime
diff options
context:
space:
mode:
authorDmitriy Vyukov <dvyukov@google.com>2014-07-22 01:56:19 +0400
committerDmitriy Vyukov <dvyukov@google.com>2014-07-22 01:56:19 +0400
commit7bcbdbd904eeaf671c608b183ae363dfa1b53ad6 (patch)
treebd4244a0e6dfe0b69063f3b86d4be5a3b4e5283f /src/pkg/runtime
parent92c54e4a73cab47b53472d49479364f1378bbff7 (diff)
downloadgo-7bcbdbd904eeaf671c608b183ae363dfa1b53ad6.tar.xz
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
Diffstat (limited to 'src/pkg/runtime')
-rw-r--r--src/pkg/runtime/panic.c2
-rw-r--r--src/pkg/runtime/slice.goc6
2 files changed, 6 insertions, 2 deletions
diff --git a/src/pkg/runtime/panic.c b/src/pkg/runtime/panic.c
index ce05725037..47e9566278 100644
--- a/src/pkg/runtime/panic.c
+++ b/src/pkg/runtime/panic.c
@@ -41,7 +41,7 @@ newdefer(int32 siz)
}
if(d == nil) {
// deferpool is empty or just a big defer
- total = TOTALSIZE(siz);
+ total = runtime·roundupsize(TOTALSIZE(siz));
d = runtime·malloc(total);
}
d->siz = siz;
diff --git a/src/pkg/runtime/slice.goc b/src/pkg/runtime/slice.goc
index 2a14dafab5..5f12a09620 100644
--- a/src/pkg/runtime/slice.goc
+++ b/src/pkg/runtime/slice.goc
@@ -117,14 +117,18 @@ growslice1(SliceType *t, Slice x, intgo newcap, Slice *ret)
if(newcap1 > MaxMem/typ->size)
runtime·panicstring("growslice: cap out of range");
+ // Try to use all memory that malloc will give us...
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;
// Can't use FlagNoZero w/o FlagNoScan, because otherwise GC can scan unitialized memory.
if(typ->kind&KindNoPointers)
flag = FlagNoScan|FlagNoZero;
ret->array = runtime·mallocgc(capmem, (uintptr)typ|TypeInfo_Array, flag);
ret->len = x.len;
- ret->cap = capmem/typ->size;
+ ret->cap = newcap1;
lenmem = x.len*typ->size;
runtime·memmove(ret->array, x.array, lenmem);
if(typ->kind&KindNoPointers)