quiet mismatched indentation warnings
[rainbows.git] / lib / rainbows / fiber / io.rb
blobdcd8c14abf501832f244ece92a9a0b8e73d70135
1 # -*- encoding: binary -*-
2 # :enddoc:
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 # It's not recommended to use any of this in your applications
8 # unless you're willing to accept breakage.  Most of this is very
9 # difficult-to-use, fragile and we don't have much time to devote to
10 # supporting these in the future.
12 # This is a stable, legacy interface and should be preserved for all
13 # future versions of Rainbows!  However, new apps should use
14 # Rainbows::Fiber::IO::Socket or Rainbows::Fiber::IO::Pipe instead
15 # (or better yet, avoid any of the Rainbows::Fiber* stuff).
16 class Rainbows::Fiber::IO
17   attr_accessor :to_io
19   # :stopdoc:
20   # see Rainbows::Fiber::IO::Compat for initialize implementation
21   class << self
22     alias :[] :new
23   end
24   # :startdoc:
26   # no longer used internally within Rainbows!, only for compatibility
27   def write_nonblock(buf)
28     @to_io.write_nonblock(buf)
29   end
31   def kgio_addr
32     @to_io.kgio_addr
33   end
35   # for wrapping output response bodies
36   def each
37     buf = readpartial(16384)
38     yield buf
39     yield buf while readpartial(16384, buf)
40   rescue EOFError
41     self
42   end
44   def closed?
45     @to_io.closed?
46   end
48   def fileno
49     @to_io.fileno
50   end
52   def write(buf)
53     case rv = Kgio.trywrite(@to_io, buf)
54     when String
55       buf = rv
56     when :wait_writable
57       kgio_wait_writable
58     end until nil == rv
59   end
61   # used for reading headers (respecting keepalive_timeout)
62   def timed_read(buf)
63     expire = nil
64     case rv = Kgio.tryread(@to_io, 16384, buf)
65     when :wait_readable
66       return if expire && expire < Rainbows.now
67       expire ||= read_expire
68       kgio_wait_readable
69     else
70       return rv
71     end while true
72   end
74   def readpartial(length, buf = "")
75     case rv = Kgio.tryread(@to_io, length, buf)
76     when nil
77       raise EOFError, "end of file reached", []
78     when :wait_readable
79       kgio_wait_readable
80     else
81       return rv
82     end while true
83   end
85   def kgio_read(*args)
86     @to_io.kgio_read(*args)
87   end
89   def kgio_read!(*args)
90     @to_io.kgio_read!(*args)
91   end
93   def kgio_trywrite(*args)
94     @to_io.kgio_trywrite(*args)
95   end
97   autoload :Socket, 'rainbows/fiber/io/socket'
98   autoload :Pipe, 'rainbows/fiber/io/pipe'
99 end
101 # :stopdoc:
102 require 'rainbows/fiber/io/methods'
103 require 'rainbows/fiber/io/compat'
104 class Rainbows::Fiber::IO
105   include Rainbows::Fiber::IO::Compat
106   include Rainbows::Fiber::IO::Methods
107   alias_method :wait_readable, :kgio_wait_readable
108   alias_method :wait_writable, :kgio_wait_writable