about summary refs log tree commit homepage
path: root/lib/rainbows/fiber.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rainbows/fiber.rb')
-rw-r--r--lib/rainbows/fiber.rb27
1 files changed, 22 insertions, 5 deletions
diff --git a/lib/rainbows/fiber.rb b/lib/rainbows/fiber.rb
index e65ef1b..94f7d94 100644
--- a/lib/rainbows/fiber.rb
+++ b/lib/rainbows/fiber.rb
@@ -6,11 +6,28 @@ rescue LoadError
   defined?(NeverBlock) or raise
 end
 
-module Rainbows
+# core module for all things that use Fibers in Rainbows!
+module Rainbows::Fiber
 
-  # core module for all things that use Fibers in Rainbows!
-  module Fiber
-    autoload :Base, 'rainbows/fiber/base'
-    autoload :Queue, 'rainbows/fiber/queue'
+  # blocked readers (key: fileno, value: Rainbows::Fiber::IO object)
+  RD = []
+
+  # blocked writers (key: fileno, value: Rainbows::Fiber::IO object)
+  WR = []
+
+  # sleeping fibers go here (key: Fiber object, value: wakeup time)
+  ZZ = {}
+
+  # puts the current Fiber into uninterruptible sleep for at least
+  # +seconds+.  Unlike Kernel#sleep, this it is not possible to sleep
+  # indefinitely to be woken up (nobody wants that in a web server,
+  # right?).  Calling this directly is deprecated, use
+  # Rainbows.sleep(seconds) instead.
+  def self.sleep(seconds)
+    ZZ[::Fiber.current] = Time.now + seconds
+    ::Fiber.yield
   end
+
+  autoload :Base, 'rainbows/fiber/base'
+  autoload :Queue, 'rainbows/fiber/queue'
 end