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/