1 # -*- encoding: binary -*-
3 require 'sleepy_penguin'
6 # Edge-triggered epoll concurrency model. This is extremely unfair
7 # and optimized for throughput at the expense of fairness
11 autoload :Server, 'rainbows/epoll/server'
12 autoload :Client, 'rainbows/epoll/client'
13 autoload :ResponsePipe, 'rainbows/epoll/response_pipe'
14 autoload :ResponseChunkPipe, 'rainbows/epoll/response_chunk_pipe'
16 attr_writer :nr_clients
20 timeout = Rainbows.server.timeout
22 EP.wait(nil, timeout) { |flags, obj| obj.epoll_run }
23 while obj = ReRun.shift
26 Rainbows::Epoll::Client.expire
29 Rainbows::Error.listen_loop(e)
30 end while Rainbows.tick || @nr_clients.call > 0
33 def init_worker_process(worker)
35 Rainbows::Epoll.const_set :EP, SleepyPenguin::Epoll.new
36 Rainbows::Client.__send__ :include, Client
39 def worker_loop(worker) # :nodoc:
40 init_worker_process(worker)