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