summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/malloc.cgo
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/malloc.cgo')
-rw-r--r--src/pkg/runtime/malloc.cgo45
1 files changed, 11 insertions, 34 deletions
diff --git a/src/pkg/runtime/malloc.cgo b/src/pkg/runtime/malloc.cgo
index 3b755fc4e..e34393a85 100644
--- a/src/pkg/runtime/malloc.cgo
+++ b/src/pkg/runtime/malloc.cgo
@@ -5,7 +5,6 @@
// See malloc.h for overview.
//
// TODO(rsc): double-check stats.
-// TODO(rsc): solve "stack overflow during malloc" problem.
package malloc
#include "runtime.h"
@@ -19,7 +18,7 @@ MStats mstats;
// Small objects are allocated from the per-thread cache's free lists.
// Large objects (> 32 kB) are allocated straight from the heap.
void*
-malloc(uintptr size)
+mallocgc(uintptr size, uint32 refflag, int32 dogc)
{
int32 sizeclass;
MCache *c;
@@ -35,6 +34,7 @@ malloc(uintptr size)
if(size == 0)
size = 1;
+ mstats.nmalloc++;
if(size <= MaxSmallSize) {
// Allocate from mcache free lists.
sizeclass = SizeToClass(size);
@@ -63,21 +63,19 @@ malloc(uintptr size)
printf("malloc %D; mlookup failed\n", (uint64)size);
throw("malloc mlookup");
}
- *ref = RefNone;
+ *ref = RefNone | refflag;
m->mallocing = 0;
+
+ if(dogc && mstats.inuse_pages > mstats.next_gc)
+ gc(0);
return v;
}
void*
-mallocgc(uintptr size)
+malloc(uintptr size)
{
- void *v;
-
- v = malloc(size);
- if(mstats.inuse_pages > mstats.next_gc)
- gc(0);
- return v;
+ return mallocgc(size, 0, 0);
}
// Free the object whose base pointer is v.
@@ -138,6 +136,7 @@ mlookup(void *v, byte **base, uintptr *size, uint32 **ref)
byte *p;
MSpan *s;
+ mstats.nlookup++;
s = MHeap_LookupMaybe(&mheap, (uintptr)v>>PageShift);
if(s == nil) {
if(base)
@@ -209,6 +208,7 @@ void*
SysAlloc(uintptr n)
{
void *p;
+
mstats.sys += n;
p = runtime_mmap(nil, n, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_ANON|MAP_PRIVATE, -1, 0);
if(p < (void*)4096) {
@@ -241,30 +241,10 @@ SysFree(void *v, uintptr n)
// Runtime stubs.
-extern void *oldmal(uint32);
-
void*
mal(uint32 n)
{
-//return oldmal(n);
- void *v;
-
- v = mallocgc(n);
-
- if(0) {
- byte *p;
- uint32 i;
- p = v;
- for(i=0; i<n; i++) {
- if(p[i] != 0) {
- printf("mal %d => %p: byte %d is non-zero\n", n, v, i);
- throw("mal");
- }
- }
- }
-
-//printf("mal %d %p\n", n, v); // |checkmal to check for overlapping returns.
- return v;
+ return mallocgc(n, 0, 1);
}
// Stack allocator uses malloc/free most of the time,
@@ -285,7 +265,6 @@ stackalloc(uint32 n)
void *v;
uint32 *ref;
-//return oldmal(n);
if(m->mallocing || m->gcing) {
lock(&stacks);
if(stacks.size == 0)
@@ -308,8 +287,6 @@ stackalloc(uint32 n)
void
stackfree(void *v)
{
-//return;
-
if(m->mallocing || m->gcing) {
lock(&stacks);
FixAlloc_Free(&stacks, v);