diff options
author | Eric Wong <normalperson@yhbt.net> | 2010-11-02 12:32:23 -0700 |
---|---|---|
committer | Eric Wong <normalperson@yhbt.net> | 2010-11-05 18:36:08 -0700 |
commit | 42747db815ad668b20849afb2a9dcdd1319713ae (patch) | |
tree | 6dcd7cb02f11bcfad40de6c72a9a6570df71c4d7 /lib/rainbows/fiber/rev/methods.rb | |
parent | 427ef4a2953a4b2d34f7dd89566a0cb5ee6e734d (diff) | |
download | rainbows-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.rb | 19 |
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 |