From: "Юрий Соколов" Date: 2014-10-18T15:59:37+04:00 Subject: [ruby-core:65780] Re: [ruby-trunk - Feature #10344] [PATCH] Implement Fiber#raise --001a11c3847a417f450505b13744 Content-Type: text/plain; charset=UTF-8 > At least, such feature should be located at ext/fiber. even if ext/fiber it is still should be implemented in C . > I'm afraid that introducing such feature increases complexity of Fiber. Not too much. Look at the patch: it uses same hook as rb_fiber_terminate. By the way, why Thread has this feature? http://www.ruby-doc.org/core-2.1.3/Thread.html#method-i-raise And why Fiber hasn't? In fact, it is strange that this feature still not presented, cause it is expected to exists. 2014-10-16 8:41 GMT+04:00 : > Issue #10344 has been updated by Koichi Sasada. > > > On 2014/10/12 1:28, Knut.Franke@gmx.de wrote: > > For some more sophisticated examples, see > https://github.com/nome/coroutines. The library does work with vanilla > Ruby, but the patch improves performance. > > > > Also, similar code can be simplified by using Fiber#raise. Compare e.g. > the two implementation of Consumer::Yielder#await at > > https://github.com/nome/coroutines/blob/master/lib/coroutines/base.rb > > I understand this feature helps some libraries. But I can't understand > why it is important. > > I'm afraid that introducing such feature increases complexity of Fiber. > Basically, I want to recommend strongly that using Fiber as > semi-croutine, ristricted feature. > > At least, such feature should be located at ext/fiber. > > -- > // SASADA Koichi at atdot dot net > > ---------------------------------------- > Feature #10344: [PATCH] Implement Fiber#raise > https://bugs.ruby-lang.org/issues/10344#change-49483 > > * Author: Knut Franke > * Status: Open > * Priority: Normal > * Assignee: > * Category: > * Target version: > ---------------------------------------- > While it is possible to implement this in pure Ruby (by wrapping > Fiber.yield and Fiber#resume), this feels like a low-level feature that > ought to be provided out of the box. Also, the C implementation is more > straight-forward, and more efficient. Unfortunately, it is not quite > possible to implement this as a C extension module (without resorting to > wrappers again); cf. the change to make_passing_arg(). > > Example usage: > > ~~~ > fib = Fiber.new do > counter = 0 > loop { counter += Fiber.yield } > counter > end > fib.resume > fib.resume 10 > fib.resume 100 > fib.raise StopIteration # => 110 > ~~~ > > ---Files-------------------------------- > 0001-Implement-Fiber-raise.patch (4.12 KB) > > > -- > https://bugs.ruby-lang.org/ > --001a11c3847a417f450505b13744 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable
> At least, such feature should be = located at ext/fiber.

even if ext/fiber it is still should be implem= ented in C .

> I'm afraid that introducing such feature increases complexity of F= iber.

Not too much. Look at the patch: it uses same hook as rb= _fiber_terminate.

By the way, why Thread has this feature? http= ://www.ruby-doc.org/core-2.1.3/Thread.html#method-i-raise
And = why Fiber hasn't? In fact, it is strange that this feature still not pr= esented, cause it is expected to exists.


2014-10-16 8:41 = GMT+04:00 <ko1@atdot.net>:
Is= sue #10344 has been updated by Koichi Sasada.


=C2=A0On 2014/10/12 1:28, Knut.Franke= @gmx.de wrote:
=C2=A0> For some more sophisticated examples, see https://github.com/nome/coroutin= es. The library does work with vanilla Ruby, but the patch improves per= formance.
=C2=A0>
=C2=A0> Also, similar code can be simplified by using Fiber#raise. Compa= re e.g. the two implementation of Consumer::Yielder#await at
=C2=A0> https://github.com/nome/coroutines/blob= /master/lib/coroutines/base.rb

=C2=A0I understand this feature helps some libraries. But I can't under= stand
=C2=A0why it is important.

=C2=A0I'm afraid that introducing such feature increases complexity of = Fiber.
=C2=A0Basically, I want to recommend strongly that using Fiber as
=C2=A0semi-croutine, ristricted feature.

=C2=A0At least, such feature should be located at ext/fiber.

=C2=A0--
=C2=A0// SASADA Koichi at atdot dot net

----------------------------------------
Feature #10344: [PATCH] Implement Fiber#raise
https://bugs.ruby-lang.org/issues/10344#change-49483

* Author: Knut Franke
* Status: Open
* Priority: Normal
* Assignee:
* Category:
* Target version:
----------------------------------------
While it is possible to implement this in pure Ruby (by wrapping Fiber.yiel= d and Fiber#resume), this feels like a low-level feature that ought to be p= rovided out of the box. Also, the C implementation is more straight-forward= , and more efficient. Unfortunately, it is not quite possible to implement = this as a C extension module (without resorting to wrappers again); cf. the= change to make_passing_arg().

Example usage:

~~~
fib =3D Fiber.new do
=C2=A0 counter =3D 0
=C2=A0 loop { counter +=3D Fiber.yield }
=C2=A0 counter
end
fib.resume
fib.resume 10
fib.resume 100
fib.raise StopIteration # =3D> 110
~~~

---Files--------------------------------
0001-Implement-Fiber-raise.patch (4.12 KB)


--
https://bugs.ruby= -lang.org/

--001a11c3847a417f450505b13744--