From 6350e45892b5b0189fe3461ba1e7f530da23ff8f Mon Sep 17 00:00:00 2001 From: Pieter Droogendijk Date: Mon, 29 Jul 2013 19:43:08 +0400 Subject: runtime: allow SetFinalizer with a func(interface{}) Fixes #5368. R=golang-dev, dvyukov CC=golang-dev, rsc https://golang.org/cl/11858043 --- src/pkg/runtime/mfinal.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'src/pkg/runtime/mfinal.c') diff --git a/src/pkg/runtime/mfinal.c b/src/pkg/runtime/mfinal.c index 1216fd4157..0412c8b196 100644 --- a/src/pkg/runtime/mfinal.c +++ b/src/pkg/runtime/mfinal.c @@ -13,6 +13,7 @@ struct Fin { FuncVal *fn; uintptr nret; + void *ot; }; // Finalizer hash table. Direct hash, linear scan, at most 3/4 full. @@ -42,7 +43,7 @@ static struct { } fintab[TABSZ]; static void -addfintab(Fintab *t, void *k, FuncVal *fn, uintptr nret) +addfintab(Fintab *t, void *k, FuncVal *fn, uintptr nret, void *ot) { int32 i, j; @@ -67,6 +68,7 @@ ret: t->key[i] = k; t->val[i].fn = fn; t->val[i].nret = nret; + t->val[i].ot = ot; } static bool @@ -87,6 +89,7 @@ lookfintab(Fintab *t, void *k, bool del, Fin *f) t->key[i] = (void*)-1; t->val[i].fn = nil; t->val[i].nret = 0; + t->val[i].ot = nil; t->ndead++; } return true; @@ -123,7 +126,7 @@ resizefintab(Fintab *tab) for(i=0; imax; i++) { k = tab->key[i]; if(k != nil && k != (void*)-1) - addfintab(&newtab, k, tab->val[i].fn, tab->val[i].nret); + addfintab(&newtab, k, tab->val[i].fn, tab->val[i].nret, tab->val[i].ot); } runtime·free(tab->key); @@ -137,7 +140,7 @@ resizefintab(Fintab *tab) } bool -runtime·addfinalizer(void *p, FuncVal *f, uintptr nret) +runtime·addfinalizer(void *p, FuncVal *f, uintptr nret, void *ot) { Fintab *tab; byte *base; @@ -166,7 +169,7 @@ runtime·addfinalizer(void *p, FuncVal *f, uintptr nret) resizefintab(tab); } - addfintab(tab, p, f, nret); + addfintab(tab, p, f, nret, ot); runtime·setblockspecial(p, true); runtime·unlock(tab); return true; @@ -175,7 +178,7 @@ runtime·addfinalizer(void *p, FuncVal *f, uintptr nret) // get finalizer; if del, delete finalizer. // caller is responsible for updating RefHasFinalizer (special) bit. bool -runtime·getfinalizer(void *p, bool del, FuncVal **fn, uintptr *nret) +runtime·getfinalizer(void *p, bool del, FuncVal **fn, uintptr *nret, void **ot) { Fintab *tab; bool res; @@ -189,6 +192,7 @@ runtime·getfinalizer(void *p, bool del, FuncVal **fn, uintptr *nret) return false; *fn = f.fn; *nret = f.nret; + *ot = f.ot; return true; } -- cgit v1.3