diff options
author | Russ Cox <rsc@golang.org> | 2009-05-29 13:31:53 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-05-29 13:31:53 -0700 |
commit | c2dc1af50f6cb6a61886c6b5beb892bcc2dd54ae (patch) | |
tree | 64604caa60ed952de35c0205f2071e9bb94087e5 /src/runtime | |
parent | ff6c8ffc03247c5e95fdbec7a93c2a900d0ce25c (diff) | |
download | golang-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.c | 11 |
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 |