about summary refs log tree commit homepage
path: root/lib/rainbows/fiber/rev/methods.rb
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2010-11-02 12:32:23 -0700
committerEric Wong <normalperson@yhbt.net>2010-11-05 18:36:08 -0700
commit42747db815ad668b20849afb2a9dcdd1319713ae (patch)
tree6dcd7cb02f11bcfad40de6c72a9a6570df71c4d7 /lib/rainbows/fiber/rev/methods.rb
parent427ef4a2953a4b2d34f7dd89566a0cb5ee6e734d (diff)
downloadrainbows-42747db815ad668b20849afb2a9dcdd1319713ae.tar.gz
Errno::EAGAIN is still a problem under Ruby 1.9.2, so try harder
to avoid it and use kgio methods.  Even when 1.9.3 is available,
kgio will still be faster as exceptions are slower than normal
return values.
Diffstat (limited to 'lib/rainbows/fiber/rev/methods.rb')
-rw-r--r--lib/rainbows/fiber/rev/methods.rb19
1 files changed, 6 insertions, 13 deletions
diff --git a/lib/rainbows/fiber/rev/methods.rb b/lib/rainbows/fiber/rev/methods.rb
index 64108a9..c09268f 100644
--- a/lib/rainbows/fiber/rev/methods.rb
+++ b/lib/rainbows/fiber/rev/methods.rb
@@ -3,7 +3,7 @@
 module Rainbows::Fiber::Rev::Methods
   class Watcher < Rev::IOWatcher
     def initialize(fio, flag)
-      @f = fio.f || Fiber.current
+      @f = Fiber.current
       super(fio, flag)
       attach(Rev::Loop.default)
     end
@@ -15,30 +15,23 @@ module Rainbows::Fiber::Rev::Methods
     alias on_writable on_readable
   end
 
-  def initialize(*args)
-    @f = Fiber.current
-    super(*args)
-    @r = @w = false
-  end
-
   def close
-    @w.detach if @w
-    @r.detach if @r
-    @r = @w = false
+    @w.detach if defined?(@w) && @w.attached?
+    @r.detach if defined?(@r) && @r.attached?
     super
   end
 
   def wait_writable
-    @w ||= Watcher.new(self, :w)
+    @w = Watcher.new(self, :w) unless defined?(@w)
     @w.enable unless @w.enabled?
     Fiber.yield
     @w.disable
   end
 
   def wait_readable
-    @r ||= Watcher.new(self, :r)
+    @r = Watcher.new(self, :r) unless defined?(@r)
     @r.enable unless @r.enabled?
-    KATO << @f
+    KATO << Fiber.current
     Fiber.yield
     @r.disable
   end