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

ruby-changes:22588

From: naruse <ko1@a...>
Date: Thu, 16 Feb 2012 07:35:07 +0900 (JST)
Subject: [ruby-changes:22588] naruse:r34637 (ruby_1_9_3): merge revision(s) 34629,34630:

naruse	2012-02-16 07:34:48 +0900 (Thu, 16 Feb 2012)

  New Revision: 34637

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

  Log:
    merge revision(s) 34629,34630:
    
    * cont.c (rb_fiber_reset_root_local_storage): add a new function to
      restore rb_thread_t::local_storage.
    
    * cont.c (rb_obj_is_fiber): add a new function to tell finalizer to
      prevent fibers from destroy.
    
    * gc.c (rb_objspace_call_finalizer): don't sweep fibers at finalizing
      objspace.
    
    * internal.h (rb_fiber_reset_root_local_storage, rb_obj_is_fiber):
      add prototypes.
    
    * vm.c (ruby_vm_destruct): reset main thread's local_storage before
      free main thread. rb_thread_t::local_storage is replaced by fiber's
      local storage when forked from fiber, and it should be already freed
      when the fiber was destroyed.
    
    * test/ruby/test_fiber.rb (test_fork_from_fiber): add test for fork
      from fiber.
      when the fiber was destroyed. [ruby-core:41456] [Bug #5700]

  Modified files:
    branches/ruby_1_9_3/ChangeLog
    branches/ruby_1_9_3/cont.c
    branches/ruby_1_9_3/gc.c
    branches/ruby_1_9_3/internal.h
    branches/ruby_1_9_3/test/ruby/test_fiber.rb
    branches/ruby_1_9_3/version.h
    branches/ruby_1_9_3/vm.c

Index: ruby_1_9_3/ChangeLog
===================================================================
--- ruby_1_9_3/ChangeLog	(revision 34636)
+++ ruby_1_9_3/ChangeLog	(revision 34637)
@@ -1,3 +1,25 @@
+Thu Feb 16 07:34:34 2012  CHIKANAGA Tomoyuki  <nagachika00@g...>
+
+	* cont.c (rb_fiber_reset_root_local_storage): add a new function to
+	  restore rb_thread_t::local_storage.
+
+	* cont.c (rb_obj_is_fiber): add a new function to tell finalizer to
+	  prevent fibers from destroy.
+
+	* gc.c (rb_objspace_call_finalizer): don't sweep fibers at finalizing
+	  objspace.
+
+	* internal.h (rb_fiber_reset_root_local_storage, rb_obj_is_fiber):
+	  add prototypes.
+
+	* vm.c (ruby_vm_destruct): reset main thread's local_storage before
+	  free main thread. rb_thread_t::local_storage is replaced by fiber's
+	  local storage when forked from fiber, and it should be already freed
+	  when the fiber was destroyed. [ruby-core:41456] [Bug #5700]
+
+	* test/ruby/test_fiber.rb (test_fork_from_fiber): add test for fork
+	  from fiber.
+
 Thu Feb 16 06:30:37 2012  Nobuyoshi Nakada  <nobu@r...>
 
 	* ext/fiddle/closure.c (callback): deal with unsinged integers.
Index: ruby_1_9_3/gc.c
===================================================================
--- ruby_1_9_3/gc.c	(revision 34636)
+++ ruby_1_9_3/gc.c	(revision 34637)
@@ -3057,7 +3057,8 @@
 	while (p < pend) {
 	    if (BUILTIN_TYPE(p) == T_DATA &&
 		DATA_PTR(p) && RANY(p)->as.data.dfree &&
-		!rb_obj_is_thread((VALUE)p) && !rb_obj_is_mutex((VALUE)p) ) {
+		!rb_obj_is_thread((VALUE)p) && !rb_obj_is_mutex((VALUE)p) &&
+		!rb_obj_is_fiber((VALUE)p)) {
 		p->as.free.flags = 0;
 		if (RTYPEDDATA_P(p)) {
 		    RDATA(p)->dfree = RANY(p)->as.typeddata.type->function.dfree;
Index: ruby_1_9_3/cont.c
===================================================================
--- ruby_1_9_3/cont.c	(revision 34636)
+++ ruby_1_9_3/cont.c	(revision 34637)
@@ -324,6 +324,17 @@
     return size;
 }
 
+VALUE
+rb_obj_is_fiber(VALUE obj)
+{
+    if (rb_typeddata_is_kind_of(obj, &fiber_data_type)) {
+	return Qtrue;
+    }
+    else {
+	return Qfalse;
+    }
+}
+
 static void
 cont_save_machine_stack(rb_thread_t *th, rb_context_t *cont)
 {
@@ -1342,6 +1353,19 @@
     return rb_fiber_transfer(return_fiber(), argc, argv);
 }
 
+void
+rb_fiber_reset_root_local_storage(VALUE thval)
+{
+    rb_thread_t *th;
+    rb_fiber_t	*fib;
+
+    GetThreadPtr(thval, th);
+    if (th->root_fiber && th->root_fiber != th->fiber) {
+	GetFiberPtr(th->root_fiber, fib);
+	th->local_storage = fib->cont.saved_thread.local_storage;
+    }
+}
+
 /*
  *  call-seq:
  *     fiber.alive? -> true or false
Index: ruby_1_9_3/internal.h
===================================================================
--- ruby_1_9_3/internal.h	(revision 34636)
+++ ruby_1_9_3/internal.h	(revision 34637)
@@ -61,6 +61,10 @@
 int rb_parse_in_main(void);
 VALUE rb_insns_name_array(void);
 
+/* cont.c */
+VALUE rb_obj_is_fiber(VALUE);
+void rb_fiber_reset_root_local_storage(VALUE);
+
 /* debug.c */
 PRINTF_ARGS(void ruby_debug_printf(const char*, ...), 1, 2);
 
Index: ruby_1_9_3/vm.c
===================================================================
--- ruby_1_9_3/vm.c	(revision 34636)
+++ ruby_1_9_3/vm.c	(revision 34637)
@@ -1609,6 +1609,7 @@
 	rb_gc_force_recycle(vm->self);
 	vm->main_thread = 0;
 	if (th) {
+	    rb_fiber_reset_root_local_storage(th->self);
 	    thread_free(th);
 	}
 	if (vm->living_threads) {
Index: ruby_1_9_3/version.h
===================================================================
--- ruby_1_9_3/version.h	(revision 34636)
+++ ruby_1_9_3/version.h	(revision 34637)
@@ -1,5 +1,5 @@
 #define RUBY_VERSION "1.9.3"
-#define RUBY_PATCHLEVEL 121
+#define RUBY_PATCHLEVEL 122
 
 #define RUBY_RELEASE_DATE "2012-02-16"
 #define RUBY_RELEASE_YEAR 2012
Index: ruby_1_9_3/test/ruby/test_fiber.rb
===================================================================
--- ruby_1_9_3/test/ruby/test_fiber.rb	(revision 34636)
+++ ruby_1_9_3/test/ruby/test_fiber.rb	(revision 34637)
@@ -220,5 +220,21 @@
     end
     assert_equal("Can't call on top of Fiber or Thread", error.message, bug5083)
   end
+
+  def test_fork_from_fiber
+    begin
+      Process.fork{}
+    rescue NotImplementedError
+      return
+    end
+    bug5700 = '[ruby-core:41456]'
+    pid = nil
+    assert_nothing_raised(bug5700) do
+      Fiber.new{ pid = fork {} }.resume
+    end
+    pid, status = Process.waitpid2(pid)
+    assert_equal(0, status.exitstatus, bug5700)
+    assert_equal(false, status.signaled?, bug5700)
+  end
 end
 

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

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