[MacRuby-devel] macruby GCD Fibers

Alan Skipp al_skipp at fastmail.fm
Thu Jan 5 07:36:47 PST 2012


Hi everyone,
I've had a go at implementing Fibers using dispatch queues. The code can be found here:

https://gist.github.com/1565393

Inspiration was taken from the following ruby 1.8 Fibers implementation: https://gist.github.com/4631

The implementation of Fiber.yield currently relies upon a hash stored as a class variable. This is hopefully just a temporary solution to get things started. The hash is always accessed through a serial queue (so it should be thread safe) and dead fibers are removed after use. There are a couple of GCD functions that look like they could be used to solve this problem: 'dispatch_queue_set_specific' and 'dispatch_set_context'. Though I'm not sure how to use these from Macruby. If anyone has any experience using either of those GCD functions I'd be interested in learning more.

The major omission currently is the lack of a 'transfer' method. I've pondered this quite a bit, but I've yet to come up with a solution. It is quite possible that the way I've written the Fiber class prevents a successful implementation of a 'transfer' method - but I've not given up just yet. If anyone has a cunning plan on how to achieve it, that would be great.

I've tested all the examples here:
http://pragdave.blogs.pragprog.com/pragdave/2007/12/pipelines-using.html

and they all seem to work, plus I've included a few tests in the gist. 
The test which creates a fiber from Fiber.current, causes macruby to crash, but I don't know why - it doesn't cause a crash when invoked normally outside of minitest.

From my limited tests, everything other than the 'transfer' method appears to be working, but feedback would be welcome if you discover any problems.

Al


More information about the MacRuby-devel mailing list