From 737087cbc8393b1a95a871b15a917872f1328c6b Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Mon, 28 Nov 2011 05:45:49 +0000 Subject: runtime: Multiplex goroutines onto OS threads. From-SVN: r181772 --- libgo/runtime/mfinal.c | 41 +++++------------------------------------ 1 file changed, 5 insertions(+), 36 deletions(-) (limited to 'libgo/runtime/mfinal.c') 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; iholds_finlock, 1, 0); - if(__sync_bool_compare_and_swap(&m->gcing_for_finlock, 1, 0)) { - runtime_throw("walkfintab not called from gc"); - } } -- cgit v1.1