[前][次][番号順一覧][スレッド一覧]

ruby-changes:25953

From: nari <ko1@a...>
Date: Fri, 30 Nov 2012 07:57:01 +0900 (JST)
Subject: [ruby-changes:25953] nari:r38010 (trunk): * gc.c (rb_objspace_call_finalizer): finalize_deferred may free up

nari	2012-11-30 07:56:02 +0900 (Fri, 30 Nov 2012)

  New Revision: 38010

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=38010

  Log:
    * 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.

  Modified files:
    trunk/ChangeLog
    trunk/gc.c
    trunk/test/ruby/test_gc.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 38009)
+++ ChangeLog	(revision 38010)
@@ -1,3 +1,12 @@
+Fri Nov 30 07:46:42 2012  Narihiro Nakamura  <authornari@g...>
+
+	* 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.
+
 Fri Nov 30 07:43:44 2012  Koichi Sasada  <ko1@a...>
 
 	* thread.c (rb_thread_interrupted): avoid warning of
@@ -462,7 +471,7 @@
 	* lib/rdoc/servlet.rb:  Add support for serving documentation from a
 	  subdirectory.
 	* lib/rdoc/generator/darkfish.rb:  ditto
-	* test/rdoc/test_rdoc_servlet.rb:  Test for above
+	* test/rdoc/test_rdoc_servlet.rb:  Tets for above
 	* test/rdoc/test_rdoc_servlet.rb:  ditto
 
 Wed Nov 28 15:37:17 2012  NARUSE, Yui  <naruse@r...>
Index: gc.c
===================================================================
--- gc.c	(revision 38009)
+++ gc.c	(revision 38010)
@@ -1504,15 +1504,9 @@
     if (ATOMIC_EXCHANGE(finalizing, 1)) return;
 
     /* run finalizers */
-    do {
-	finalize_deferred(objspace);
-	/* mark reachable objects from finalizers */
-	/* They might be not referred from any place here */
-	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);
+    finalize_deferred(objspace);
+    assert(deferred_final_list == 0);
+
     /* force to run finalizer */
     while (finalizer_table->num_entries) {
 	struct force_finalize_list *list = 0;
Index: test/ruby/test_gc.rb
===================================================================
--- test/ruby/test_gc.rb	(revision 38009)
+++ test/ruby/test_gc.rb	(revision 38010)
@@ -134,4 +134,10 @@
   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

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]