diff options
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | gc.c | 15 | ||||
-rw-r--r-- | test/ruby/test_gc.rb | 6 | ||||
-rw-r--r-- | version.h | 2 |
4 files changed, 21 insertions, 11 deletions
@@ -1,3 +1,12 @@ +Tue Jan 15 16:25:35 2013 Narihiro Nakamura <authornari@gmail.com> + + * gc.c (rb_objspace_call_finalizer): finalize_deferred may free up + a object which is reachable from a part after this function, + e.g. ruby_vm_destruct(). [ruby-dev:46647] [Bug #7452] + + * test/ruby/test_gc.rb (test_finalizing_main_thread): add a test + for above. + Tue Jan 15 16:23:30 2013 NARUSE, Yui <naruse@ruby-lang.org> * lib/net/protocol.rb (Net::InternetMessageIO#each_crlf_line): @@ -25,6 +25,7 @@ #include <stdio.h> #include <setjmp.h> #include <sys/types.h> +#include <assert.h> #ifdef HAVE_SYS_TIME_H #include <sys/time.h> @@ -3101,18 +3102,12 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace) RVALUE *final_list = 0; size_t i; - /* run finalizers */ rest_sweep(objspace); - do { - /* XXX: this loop will make no sense */ - /* because mark will not be removed */ - finalize_deferred(objspace); - mark_tbl(objspace, finalizer_table); - gc_mark_stacked_objects(objspace); - st_foreach(finalizer_table, chain_finalized_object, - (st_data_t)&deferred_final_list); - } while (deferred_final_list); + /* run finalizers */ + finalize_deferred(objspace); + assert(deferred_final_list == 0); + /* force to run finalizer */ while (finalizer_table->num_entries) { struct force_finalize_list *list = 0; diff --git a/test/ruby/test_gc.rb b/test/ruby/test_gc.rb index 63bec82aad..f04e7e0255 100644 --- a/test/ruby/test_gc.rb +++ b/test/ruby/test_gc.rb @@ -106,4 +106,10 @@ class TestGc < Test::Unit::TestCase ensure GC::Profiler.disable end + + def test_finalizing_main_thread + assert_in_out_err(%w[--disable-gems], <<-EOS, ["\"finalize\""], [], "[ruby-dev:46647]") + ObjectSpace.define_finalizer(Thread.main) { p 'finalize' } + EOS + end end @@ -1,5 +1,5 @@ #define RUBY_VERSION "1.9.3" -#define RUBY_PATCHLEVEL 371 +#define RUBY_PATCHLEVEL 372 #define RUBY_RELEASE_DATE "2013-01-15" #define RUBY_RELEASE_YEAR 2013 |