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/rev/master.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/rev/master.rb')
-rw-r--r-- | lib/rainbows/rev/master.rb | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/lib/rainbows/rev/master.rb b/lib/rainbows/rev/master.rb index 21b583a..8e5d4ef 100644 --- a/lib/rainbows/rev/master.rb +++ b/lib/rainbows/rev/master.rb @@ -2,20 +2,23 @@ # :enddoc: require 'rainbows/rev' -class Rainbows::Rev::Master < Rev::AsyncWatcher +class Rainbows::Rev::Master < Rev::IOWatcher def initialize(queue) - super() + @reader, @writer = Kgio::Pipe.new + super(@reader) @queue = queue end def <<(output) @queue << output - signal + @writer.kgio_trywrite("\0") end - def on_signal - client, response = @queue.pop - client.response_write(response) + def on_readable + if String === @reader.kgio_tryread(1) + client, response = @queue.pop + client.response_write(response) + end end end |