initial edge-triggered epoll model
[rainbows.git] / lib / rainbows / epoll / response_pipe.rb
blobce240f50c4b2182b1653ad5d7c9e7ea196d0f5ee
1 # -*- encoding: binary -*-
2 # :enddoc:
4 class Rainbows::Epoll::ResponsePipe
5   include Rainbows::Epoll::State
6   attr_reader :io
7   alias to_io io
8   IN = SleepyPenguin::Epoll::IN | SleepyPenguin::Epoll::ET
9   RBUF = Rainbows::EvCore::RBUF
11   def initialize(io, client, body)
12     @io, @client, @body = io, client, body
13     @epoll_active = false
14   end
16   def epoll_run
17     return close if @client.closed?
18     @client.stream_pipe(self) or @client.on_deferred_write_complete
19     rescue => e
20       close
21       @client.handle_error(e)
22   end
24   def close
25     epoll_disable
26     @body.respond_to?(:close) and @body.close
27     @io = @body = nil
28   end
30   def tryread
31     io = @io
32     io.respond_to?(:kgio_tryread) and return io.kgio_tryread(16384, RBUF)
33     io.read_nonblock(16384, RBUF)
34     rescue Errno::EAGAIN
35       :wait_readable
36     rescue EOFError
37   end
38 end