bump required Unicorn dependency for Kgio
[rainbows.git] / lib / rainbows / fiber / io.rb
blob49aef3d069ce04340c8fc0cd8291aedc241b9b65
1 # -*- encoding: binary -*-
3 # A Fiber-aware IO class, gives users the illusion of a synchronous
4 # interface that yields away from the current Fiber whenever
5 # the underlying descriptor is blocked on reads or write
7 # This is a stable, legacy interface and should be preserved for all
8 # future versions of Rainbows!  However, new apps should use
9 # Rainbows::Fiber::IO::Socket or Rainbows::Fiber::IO::Pipe instead.
11 class Rainbows::Fiber::IO
12   attr_accessor :to_io
14   # :stopdoc:
15   # see Rainbows::Fiber::IO::Compat for initialize implementation
16   class << self
17     alias :[] :new
18   end
19   # :startdoc:
21   # no longer used internally within Rainbows!, only for compatibility
22   def write_nonblock(buf)
23     @to_io.write_nonblock(buf)
24   end
26   def kgio_addr
27     @to_io.kgio_addr
28   end
30   # for wrapping output response bodies
31   def each(&block)
32     buf = readpartial(16384)
33     yield buf
34     yield buf while readpartial(16384, buf)
35     rescue EOFError
36       self
37   end
39   def closed?
40     @to_io.closed?
41   end
43   def fileno
44     @to_io.fileno
45   end
47   def write(buf)
48     case rv = Kgio.trywrite(buf)
49     when String
50       buf = rv
51     when :wait_writable
52       kgio_wait_writable
53     end until nil == rv
54   end
56   # used for reading headers (respecting keepalive_timeout)
57   def timed_read(buf)
58     expire = nil
59     case rv = Kgio.tryread(@to_io, 16384, buf)
60     when :wait_readable
61       return if expire && expire < Time.now
62       expire ||= read_expire
63       kgio_wait_readable
64     else
65       return rv
66     end while true
67   end
69   def readpartial(length, buf = "")
70     case rv = Kgio.tryread(@to_io, length, buf)
71     when nil
72       raise EOFError, "end of file reached", []
73     when :wait_readable
74       kgio_wait_readable
75     else
76       return rv
77     end while true
78   end
80   def kgio_read(*args)
81     @to_io.kgio_read(*args)
82   end
84   def kgio_read!(*args)
85     @to_io.kgio_read!(*args)
86   end
88   def kgio_trywrite(*args)
89     @to_io.kgio_trywrite(*args)
90   end
92   autoload :Socket, 'rainbows/fiber/io/socket'
93   autoload :Pipe, 'rainbows/fiber/io/pipe'
94 end
96 # :stopdoc:
97 require 'rainbows/fiber/io/methods'
98 require 'rainbows/fiber/io/compat'
99 Rainbows::Client.__send__(:include, Rainbows::Fiber::IO::Methods)
100 class Rainbows::Fiber::IO
101   include Rainbows::Fiber::IO::Compat
102   include Rainbows::Fiber::IO::Methods
103   alias_method :wait_readable, :kgio_wait_readable
104   alias_method :wait_writable, :kgio_wait_writable