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

ruby-changes:21755

From: naruse <ko1@a...>
Date: Mon, 21 Nov 2011 06:18:08 +0900 (JST)
Subject: [ruby-changes:21755] naruse:r33804 (trunk): * cont.c (fiber_switch): ignore fiber context switch

naruse	2011-11-21 06:17:57 +0900 (Mon, 21 Nov 2011)

  New Revision: 33804

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

  Log:
    * cont.c (fiber_switch): ignore fiber context switch
      because destination fiber is same as current fiber.
      With out this, it may segv on FreeBSD 9.
      patched by Koichi Sasada.

  Modified files:
    trunk/ChangeLog
    trunk/cont.c
    trunk/test/ruby/test_fiber.rb

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 33803)
+++ ChangeLog	(revision 33804)
@@ -1,3 +1,10 @@
+Mon Nov 21 06:16:24 2011  NARUSE, Yui  <naruse@r...>
+
+	* cont.c (fiber_switch): ignore fiber context switch
+	  because destination fiber is same as current fiber.
+	  With out this, it may segv on FreeBSD 9.
+	  patched by Koichi Sasada.
+
 Sun Nov 20 23:22:42 2011  Nobuyoshi Nakada  <nobu@r...>
 
 	* ext/extmk.rb (extract_makefile, extmake): regenerate makefiles
Index: cont.c
===================================================================
--- cont.c	(revision 33803)
+++ cont.c	(revision 33804)
@@ -1260,6 +1260,13 @@
     GetFiberPtr(fibval, fib);
     cont = &fib->cont;
 
+    if (th->fiber == fibval) {
+	/* ignore fiber context switch
+         * because destination fiber is same as current fiber
+	 */
+	return make_passing_arg(argc, argv);
+    }
+
     if (cont->saved_thread.self != th->self) {
 	rb_raise(rb_eFiberError, "fiber called across threads");
     }
Index: test/ruby/test_fiber.rb
===================================================================
--- test/ruby/test_fiber.rb	(revision 33803)
+++ test/ruby/test_fiber.rb	(revision 33804)
@@ -188,6 +188,11 @@
       f2 = Fiber.new{ f1.resume }
       f1.transfer
     }, '[ruby-dev:40833]'
+    assert_normal_exit %q{
+      require 'fiber'
+      Fiber.new{}.resume
+      1.times{Fiber.current.transfer}'
+    }
   end
 
   def test_resume_root_fiber

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

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