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

ruby-changes:21635

From: ko1 <ko1@a...>
Date: Wed, 9 Nov 2011 13:26:51 +0900 (JST)
Subject: [ruby-changes:21635] ko1:r33684 (trunk): * cont.c (rb_fiber_m_transfer, rb_fiber_resume): prohibit using

ko1	2011-11-09 13:26:39 +0900 (Wed, 09 Nov 2011)

  New Revision: 33684

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

  Log:
    * cont.c (rb_fiber_m_transfer, rb_fiber_resume): prohibit using
      "resume" after "transfer" method are used.  You should not mix
      "resume" fiber and "transfer" fiber.
      [Bug #5526]
    * NEWS: add information about this change.

  Modified files:
    trunk/ChangeLog
    trunk/NEWS
    trunk/cont.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 33683)
+++ ChangeLog	(revision 33684)
@@ -1,3 +1,12 @@
+Thu Nov 10 05:17:25 2011  Koichi Sasada  <ko1@a...>
+
+	* cont.c (rb_fiber_m_transfer, rb_fiber_resume): prohibit using
+	  "resume" after "transfer" method are used.  You should not mix
+	  "resume" fiber and "transfer" fiber.
+	  [Bug #5526]
+
+	* NEWS: add information about this change.
+
 Wed Nov  9 11:40:37 2011  Nobuyoshi Nakada  <nobu@r...>
 
 	* template/Doxyfile.tmpl (INCLUDE_PATH): add srcdir and include.
Index: NEWS
===================================================================
--- NEWS	(revision 33683)
+++ NEWS	(revision 33684)
@@ -32,6 +32,10 @@
       * Time#to_s returned encoding defaults to US-ASCII but automatically
         transcodes to Encoding.default_internal if it is set.
 
+  * Fiber
+    * incompatible changes:
+      * Fiber#resume cannot resume a fiber which invokes "Fiber#transfer".
+
 * net/imap
   * new methods:
     * Net::IMAP.default_port
Index: cont.c
===================================================================
--- cont.c	(revision 33683)
+++ cont.c	(revision 33684)
@@ -103,6 +103,12 @@
     enum fiber_status status;
     struct rb_fiber_struct *prev_fiber;
     struct rb_fiber_struct *next_fiber;
+    /* If a fiber invokes "transfer",
+     * then this fiber can't "resume" any more after that.
+     * You shouldn't mix "transfer" and "resume".
+     */
+    int transfered;
+
 #if FIBER_USE_NATIVE
 #ifdef _WIN32
     void *fib_handle;
@@ -1322,6 +1328,9 @@
     if (fib->prev != Qnil || fib->cont.type == ROOT_FIBER_CONTEXT) {
 	rb_raise(rb_eFiberError, "double resume");
     }
+    if (fib->transfered != 0) {
+	rb_raise(rb_eFiberError, "cannot resume transferred Fiber");
+    }
 
     return fiber_switch(fibval, argc, argv, 1);
 }
@@ -1389,9 +1398,12 @@
  *  back to this fiber before it can yield and resume.
  */
 static VALUE
-rb_fiber_m_transfer(int argc, VALUE *argv, VALUE fib)
+rb_fiber_m_transfer(int argc, VALUE *argv, VALUE fibval)
 {
-    return rb_fiber_transfer(fib, argc, argv);
+    rb_fiber_t *fib;
+    GetFiberPtr(fibval, fib);
+    fib->transfered = 1;
+    return rb_fiber_transfer(fibval, argc, argv);
 }
 
 /*

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

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