From ac388541c4c32a9199af0bf6f2d91fc9aadee9df Mon Sep 17 00:00:00 2001 From: nobu Date: Mon, 30 Jun 2008 13:12:49 +0000 Subject: * gc.c (chain_finalized_object): should not delete from finalizer table until run. * gc.c (rb_gc_call_finalizer_at_exit): deferred_final_list may be empty first. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17737 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- gc.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'gc.c') diff --git a/gc.c b/gc.c index 1147bffece..e4e6312126 100644 --- a/gc.c +++ b/gc.c @@ -2041,7 +2041,7 @@ chain_finalized_object(st_data_t key, st_data_t val, st_data_t arg) p->as.free.next = *final_list; *final_list = p; } - return ST_DELETE; + return ST_CONTINUE; } void @@ -2053,12 +2053,13 @@ rb_gc_call_finalizer_at_exit(void) /* run finalizers */ if (need_call_final) { - while ((p = deferred_final_list) != 0) { + do { + p = deferred_final_list; deferred_final_list = 0; finalize_list(objspace, p); st_foreach(finalizer_table, chain_finalized_object, (st_data_t)&deferred_final_list); - } + } while (deferred_final_list); } /* finalizers are part of garbage collection */ during_gc++; -- cgit v1.2.3