FWIW, I've solved the same problem using Ruby's very own 'Kernel#callcc'. Pros: small (~40 lines), robust, works with any Ruby that has 'callcc', true drop-in replacement (no patching necessary). Cons: Probably less efficient (dependent on the run-time characteristics of the 'callcc' implementation).
So as long as you don't want to create thousands of fibers per second, this is an alternative:
http://www.khjk.org/log/2010/jun/fibr.html