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
_______________________________________________
MacRuby-devel mailing list
MacRuby-devel@lists.macosforge.org
http://lists.macosforge.org/mailman/listinfo.cgi/macruby-devel

Reply via email to