diff options
| author | Dmitriy Vyukov <dvyukov@google.com> | 2012-05-02 18:01:11 +0400 |
|---|---|---|
| committer | Dmitriy Vyukov <dvyukov@google.com> | 2012-05-02 18:01:11 +0400 |
| commit | c1c851bbe806d8fb3f483a32e8dfac48522dfe21 (patch) | |
| tree | 4873e4caab1ecf83da7b7c57eba60d94cc2f567e /src/pkg/runtime | |
| parent | 0d55d9832f6b21a5c273073e1703d1d0ae5ecb02 (diff) | |
| download | go-c1c851bbe806d8fb3f483a32e8dfac48522dfe21.tar.xz | |
runtime: avoid unnecessary zeroization of huge memory blocks
+move zeroization out of the heap mutex
R=golang-dev, iant, rsc
CC=golang-dev
https://golang.org/cl/6094050
Diffstat (limited to 'src/pkg/runtime')
| -rw-r--r-- | src/pkg/runtime/malloc.goc | 2 | ||||
| -rw-r--r-- | src/pkg/runtime/malloc.h | 2 | ||||
| -rw-r--r-- | src/pkg/runtime/mcentral.c | 2 | ||||
| -rw-r--r-- | src/pkg/runtime/mheap.c | 7 |
4 files changed, 6 insertions, 7 deletions
diff --git a/src/pkg/runtime/malloc.goc b/src/pkg/runtime/malloc.goc index fbdd6bb021..4bea5e220c 100644 --- a/src/pkg/runtime/malloc.goc +++ b/src/pkg/runtime/malloc.goc @@ -60,7 +60,7 @@ runtime·mallocgc(uintptr size, uint32 flag, int32 dogc, int32 zeroed) npages = size >> PageShift; if((size & PageMask) != 0) npages++; - s = runtime·MHeap_Alloc(&runtime·mheap, npages, 0, 1); + s = runtime·MHeap_Alloc(&runtime·mheap, npages, 0, 1, zeroed); if(s == nil) runtime·throw("out of memory"); size = npages<<PageShift; diff --git a/src/pkg/runtime/malloc.h b/src/pkg/runtime/malloc.h index 66919c911e..081ebd1394 100644 --- a/src/pkg/runtime/malloc.h +++ b/src/pkg/runtime/malloc.h @@ -380,7 +380,7 @@ struct MHeap extern MHeap runtime·mheap; void runtime·MHeap_Init(MHeap *h, void *(*allocator)(uintptr)); -MSpan* runtime·MHeap_Alloc(MHeap *h, uintptr npage, int32 sizeclass, int32 acct); +MSpan* runtime·MHeap_Alloc(MHeap *h, uintptr npage, int32 sizeclass, int32 acct, int32 zeroed); void runtime·MHeap_Free(MHeap *h, MSpan *s, int32 acct); MSpan* runtime·MHeap_Lookup(MHeap *h, void *v); MSpan* runtime·MHeap_LookupMaybe(MHeap *h, void *v); diff --git a/src/pkg/runtime/mcentral.c b/src/pkg/runtime/mcentral.c index 6fc95aec7b..558b35b0e1 100644 --- a/src/pkg/runtime/mcentral.c +++ b/src/pkg/runtime/mcentral.c @@ -207,7 +207,7 @@ MCentral_Grow(MCentral *c) runtime·unlock(c); runtime·MGetSizeClassInfo(c->sizeclass, &size, &npages, &n); - s = runtime·MHeap_Alloc(&runtime·mheap, npages, c->sizeclass, 0); + s = runtime·MHeap_Alloc(&runtime·mheap, npages, c->sizeclass, 0, 1); if(s == nil) { // TODO(rsc): Log out of memory runtime·lock(c); diff --git a/src/pkg/runtime/mheap.c b/src/pkg/runtime/mheap.c index 077217dc5d..a8a435b20e 100644 --- a/src/pkg/runtime/mheap.c +++ b/src/pkg/runtime/mheap.c @@ -66,7 +66,7 @@ runtime·MHeap_Init(MHeap *h, void *(*alloc)(uintptr)) // Allocate a new span of npage pages from the heap // and record its size class in the HeapMap and HeapMapCache. MSpan* -runtime·MHeap_Alloc(MHeap *h, uintptr npage, int32 sizeclass, int32 acct) +runtime·MHeap_Alloc(MHeap *h, uintptr npage, int32 sizeclass, int32 acct, int32 zeroed) { MSpan *s; @@ -81,6 +81,8 @@ runtime·MHeap_Alloc(MHeap *h, uintptr npage, int32 sizeclass, int32 acct) } } runtime·unlock(h); + if(s != nil && *(uintptr*)(s->start<<PageShift) != 0 && zeroed) + runtime·memclr((byte*)(s->start<<PageShift), s->npages<<PageShift); return s; } @@ -138,9 +140,6 @@ HaveSpan: MHeap_FreeLocked(h, t); } - if(*(uintptr*)(s->start<<PageShift) != 0) - runtime·memclr((byte*)(s->start<<PageShift), s->npages<<PageShift); - // Record span info, because gc needs to be // able to map interior pointer to containing span. s->sizeclass = sizeclass; |
