aboutsummaryrefslogtreecommitdiff
path: root/libgo/runtime/mfinal.c
diff options
context:
space:
mode:
authorIan Lance Taylor <ian@gcc.gnu.org>2011-11-28 05:45:49 +0000
committerIan Lance Taylor <ian@gcc.gnu.org>2011-11-28 05:45:49 +0000
commit737087cbc8393b1a95a871b15a917872f1328c6b (patch)
treeaf256a0152425084325ad100d75615322c726b8a /libgo/runtime/mfinal.c
parenta01207c473dcab88eb0ac769d2d9c68d7c9e0588 (diff)
downloadgcc-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.c41
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");
- }
}