use IO#wait instead of IO.select for single readers
[rainbows.git] / lib / rainbows / client.rb
blob9b65cea0aac44bd5bad8c4222d7e1a85deb13c83
1 # -*- encoding: binary -*-
2 # :enddoc:
3 require "io/wait"
5 # this class is used for most synchronous concurrency models
6 class Rainbows::Client < Kgio::Socket
7   def read_expire
8     Time.now + Rainbows.keepalive_timeout
9   end
11   def kgio_wait_readable
12     wait Rainbows.keepalive_timeout
13   end
15   # used for reading headers (respecting keepalive_timeout)
16   def timed_read(buf)
17     expire = nil
18     begin
19       case rv = kgio_tryread(16384, buf)
20       when :wait_readable
21         return if expire && expire < Time.now
22         expire ||= read_expire
23         kgio_wait_readable
24       else
25         return rv
26       end
27     end while true
28   end
30   include Rainbows::ProcessClient
31 end