diff options
author | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-11-28 05:45:49 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@gcc.gnu.org> | 2011-11-28 05:45:49 +0000 |
commit | 737087cbc8393b1a95a871b15a917872f1328c6b (patch) | |
tree | af256a0152425084325ad100d75615322c726b8a /libgo/runtime/mfinal.c | |
parent | a01207c473dcab88eb0ac769d2d9c68d7c9e0588 (diff) | |
download | gcc-737087cbc8393b1a95a871b15a917872f1328c6b.zip gcc-737087cbc8393b1a95a871b15a917872f1328c6b.tar.gz gcc-737087cbc8393b1a95a871b15a917872f1328c6b.tar.bz2 |
runtime: Multiplex goroutines onto OS threads.
From-SVN: r181772
Diffstat (limited to 'libgo/runtime/mfinal.c')
-rw-r--r-- | libgo/runtime/mfinal.c | 41 |
1 files changed, 5 insertions, 36 deletions
diff --git a/libgo/runtime/mfinal.c b/libgo/runtime/mfinal.c index 3494251..a890037 100644 --- a/libgo/runtime/mfinal.c +++ b/libgo/runtime/mfinal.c @@ -141,28 +141,24 @@ runtime_addfinalizer(void *p, void (*f)(void*), const struct __go_func_type *ft) { Fintab *tab; byte *base; - bool ret = false; if(debug) { if(!runtime_mlookup(p, &base, nil, nil) || p != base) runtime_throw("addfinalizer on invalid pointer"); } - if(!__sync_bool_compare_and_swap(&m->holds_finlock, 0, 1)) - runtime_throw("finalizer deadlock"); - tab = TAB(p); runtime_lock(tab); if(f == nil) { if(lookfintab(tab, p, true, nil)) runtime_setblockspecial(p, false); - ret = true; - goto unlock; + runtime_unlock(tab); + return true; } if(lookfintab(tab, p, false, nil)) { - ret = false; - goto unlock; + runtime_unlock(tab); + return false; } if(tab->nkey >= tab->max/2+tab->max/4) { @@ -173,18 +169,8 @@ runtime_addfinalizer(void *p, void (*f)(void*), const struct __go_func_type *ft) addfintab(tab, p, f, ft); runtime_setblockspecial(p, true); - ret = true; - - unlock: runtime_unlock(tab); - - __sync_bool_compare_and_swap(&m->holds_finlock, 1, 0); - - if(__sync_bool_compare_and_swap(&m->gcing_for_finlock, 1, 0)) { - __go_run_goroutine_gc(200); - } - - return ret; + return true; } // get finalizer; if del, delete finalizer. @@ -196,19 +182,10 @@ runtime_getfinalizer(void *p, bool del, void (**fn)(void*), const struct __go_fu bool res; Fin f; - if(!__sync_bool_compare_and_swap(&m->holds_finlock, 0, 1)) - runtime_throw("finalizer deadlock"); - tab = TAB(p); runtime_lock(tab); res = lookfintab(tab, p, del, &f); runtime_unlock(tab); - - __sync_bool_compare_and_swap(&m->holds_finlock, 1, 0); - if(__sync_bool_compare_and_swap(&m->gcing_for_finlock, 1, 0)) { - __go_run_goroutine_gc(201); - } - if(res==false) return false; *fn = f.fn; @@ -223,9 +200,6 @@ runtime_walkfintab(void (*fn)(void*), void (*scan)(byte *, int64)) void **ekey; int32 i; - if(!__sync_bool_compare_and_swap(&m->holds_finlock, 0, 1)) - runtime_throw("finalizer deadlock"); - for(i=0; i<TABSZ; i++) { runtime_lock(&fintab[i]); key = fintab[i].fkey; @@ -237,9 +211,4 @@ runtime_walkfintab(void (*fn)(void*), void (*scan)(byte *, int64)) scan((byte*)&fintab[i].val, sizeof(void*)); runtime_unlock(&fintab[i]); } - - __sync_bool_compare_and_swap(&m->holds_finlock, 1, 0); - if(__sync_bool_compare_and_swap(&m->gcing_for_finlock, 1, 0)) { - runtime_throw("walkfintab not called from gc"); - } } |