OSDN Git Service

Avoid deadlock creating new thread.
authorian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 22 Jan 2011 00:12:00 +0000 (00:12 +0000)
committerian <ian@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 22 Jan 2011 00:12:00 +0000 (00:12 +0000)
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@169114 138bc75d-0d04-0410-961f-82ee72b054a4

libgo/runtime/malloc.goc

index be37777..d826d47 100644 (file)
@@ -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;
 }