From 7e33c4aadcbd1fbd6a83a9246776cff3c4680e1e Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Sat, 22 Jan 2011 00:12:00 +0000 Subject: [PATCH] Avoid deadlock creating new thread. From-SVN: r169114 --- libgo/runtime/malloc.goc | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/libgo/runtime/malloc.goc b/libgo/runtime/malloc.goc index be37777d7bd..d826d479f5c 100644 --- a/libgo/runtime/malloc.goc +++ b/libgo/runtime/malloc.goc @@ -255,6 +255,9 @@ runtime_allocmcache(void) { MCache *c; + if(!__sync_bool_compare_and_swap(&m->mallocing, 0, 1)) + runtime_throw("allocmcache - deadlock"); + runtime_lock(&runtime_mheap); c = runtime_FixAlloc_Alloc(&runtime_mheap.cachealloc); @@ -264,6 +267,11 @@ runtime_allocmcache(void) mstats.mcache_inuse = runtime_mheap.cachealloc.inuse; mstats.mcache_sys = runtime_mheap.cachealloc.sys; runtime_unlock(&runtime_mheap); + + __sync_bool_compare_and_swap(&m->mallocing, 1, 0); + if(__sync_bool_compare_and_swap(&m->gcing, 1, 0)) + __go_run_goroutine_gc(2); + return c; }