code shuffling for kgio
[rainbows.git] / lib / rainbows / fiber.rb
blob94f7d946bf085a7d24b1d2397dc430cd063fc506
1 # -*- encoding: binary -*-
2 # :enddoc:
3 begin
4   require 'fiber'
5 rescue LoadError
6   defined?(NeverBlock) or raise
7 end
9 # core module for all things that use Fibers in Rainbows!
10 module Rainbows::Fiber
12   # blocked readers (key: fileno, value: Rainbows::Fiber::IO object)
13   RD = []
15   # blocked writers (key: fileno, value: Rainbows::Fiber::IO object)
16   WR = []
18   # sleeping fibers go here (key: Fiber object, value: wakeup time)
19   ZZ = {}
21   # puts the current Fiber into uninterruptible sleep for at least
22   # +seconds+.  Unlike Kernel#sleep, this it is not possible to sleep
23   # indefinitely to be woken up (nobody wants that in a web server,
24   # right?).  Calling this directly is deprecated, use
25   # Rainbows.sleep(seconds) instead.
26   def self.sleep(seconds)
27     ZZ[::Fiber.current] = Time.now + seconds
28     ::Fiber.yield
29   end
31   autoload :Base, 'rainbows/fiber/base'
32   autoload :Queue, 'rainbows/fiber/queue'
33 end