summaryrefslogtreecommitdiff
path: root/src/runtime
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-05-29 13:31:53 -0700
committerRuss Cox <rsc@golang.org>2009-05-29 13:31:53 -0700
commitc2dc1af50f6cb6a61886c6b5beb892bcc2dd54ae (patch)
tree64604caa60ed952de35c0205f2071e9bb94087e5 /src/runtime
parentff6c8ffc03247c5e95fdbec7a93c2a900d0ce25c (diff)
downloadgolang-c2dc1af50f6cb6a61886c6b5beb892bcc2dd54ae.tar.gz
Fix godoc deadlock.
The code was already careful not to use malloc/free for stack growth during calls to malloc. Avoid them during calls to free too. R=r DELTA=9 (7 added, 0 deleted, 2 changed) OCL=29606 CL=29610
Diffstat (limited to 'src/runtime')
-rw-r--r--src/runtime/malloc.c11
1 files changed, 9 insertions, 2 deletions
diff --git a/src/runtime/malloc.c b/src/runtime/malloc.c
index 5f23f0f64..b33cc6fe2 100644
--- a/src/runtime/malloc.c
+++ b/src/runtime/malloc.c
@@ -28,7 +28,7 @@ malloc(uintptr size)
uint32 *ref;
if(m->mallocing)
- throw("malloc - deadlock");
+ throw("malloc/free - deadlock");
m->mallocing = 1;
if(size == 0)
@@ -89,6 +89,10 @@ free(void *v)
if(v == nil)
return;
+ if(m->mallocing)
+ throw("malloc/free - deadlock");
+ m->mallocing = 1;
+
mlookup(v, nil, nil, &ref);
*ref = RefFree;
@@ -106,7 +110,7 @@ free(void *v)
mstats.alloc -= s->npages<<PageShift;
sys_memclr(v, s->npages<<PageShift);
MHeap_Free(&mheap, s);
- return;
+ goto out;
}
MHeapMapCache_SET(&mheap.mapcache, page, sizeclass);
}
@@ -117,6 +121,9 @@ free(void *v)
sys_memclr(v, size);
mstats.alloc -= size;
MCache_Free(c, v, sizeclass, size);
+
+out:
+ m->mallocing = 0;
}
int32