fiber/*: more efficient keepalive_timeout expiry
[rainbows.git] / lib / rainbows / timed_read.rb
blobdd7939e78142a04e179008450408d30332a5045b
1 # -*- encoding: binary -*-
2 # :enddoc:
3 module Rainbows::TimedRead
4   G = Rainbows::G # :nodoc:
6   def read_expire
7     Time.now + G.kato
8   end
10   def kgio_wait_readable
11     IO.select([self], nil, nil, G.kato)
12   end
14   # used for reading headers (respecting keepalive_timeout)
15   def timed_read(buf)
16     expire = nil
17     begin
18       case rv = kgio_tryread(16384, buf)
19       when :wait_readable
20         return if expire && expire < Time.now
21         expire ||= read_expire
22         kgio_wait_readable
23       else
24         return rv
25       end
26     end while true
27   end
28 end