about summary refs log tree commit homepage
path: root/lib/rainbows/fiber.rb
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2010-10-21 16:25:39 -0700
committerEric Wong <normalperson@yhbt.net>2010-10-22 18:37:45 +0000
commit15631717fce044fbad2f386a7b1c7daf4bdd83d2 (patch)
treef32c80aafb8b5fe13fefe9a1e3765dd757ccde7d /lib/rainbows/fiber.rb
parentd4a2b5dd2b85f4b2d3bb120ee1e1b0dde31bc25c (diff)
downloadrainbows-15631717fce044fbad2f386a7b1c7daf4bdd83d2.tar.gz
Despite the large number of changes, most of it is code
movement here.
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