1 # -*- encoding: binary -*-
4 module Rainbows::XAcceptEpoll::Client
5 include Rainbows::Epoll::Client
6 MAX = Rainbows.server.worker_connections
8 EP = Rainbows::Epoll::EP
10 @timeout = Rainbows.server.timeout / 2.0
11 THREADS = Rainbows::HttpServer::LISTENERS.map do |sock|
12 Thread.new(sock) do |sock|
15 if io = sock.kgio_accept
19 sleep while N[0] >= MAX
21 Rainbows::Error.listen_loop(e)
22 end while Rainbows.alive
27 THREADS.each { |t| t.run }
29 EP.wait(nil, @timeout) { |flags, obj| obj.epoll_run }
30 Rainbows::Epoll::Client.expire
33 Rainbows::Error.listen_loop(e)
34 end while Rainbows.tick
36 THREADS.delete_if do |thr|
44 end until THREADS.empty?
49 @wr_queue = [] # may contain String, ResponsePipe, and StreamFile objects
51 EP.set(self, IN) # wake up the main thread
53 Rainbows::Error.write(self, e)
58 N.decr(0, 1) == THRESH and THREADS.each { |t| t.run }