*epoll: refactor common loop code
[rainbows.git] / lib / rainbows / epoll.rb
blob075fcfb3141b5875a0eb1ae15d419a9274042f0d
1 # -*- encoding: binary -*-
2 # :enddoc:
3 require 'sleepy_penguin'
4 require 'sendfile'
6 # Edge-triggered epoll concurrency model.  This is extremely unfair
7 # and optimized for throughput at the expense of fairness
8 module Rainbows::Epoll
9   include Rainbows::Base
10   ReRun = []
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'
15   class << self
16     attr_writer :nr_clients
17   end
19   def self.loop
20     timeout = Rainbows.server.timeout
21     begin
22       EP.wait(nil, timeout) { |flags, obj| obj.epoll_run }
23       while obj = ReRun.shift
24         obj.epoll_run
25       end
26       Rainbows::Epoll::Client.expire
27     rescue Errno::EINTR
28     rescue => e
29       Rainbows::Error.listen_loop(e)
30     end while Rainbows.tick || @nr_clients.call > 0
31   end
33   def init_worker_process(worker)
34     super
35     Rainbows::Epoll.const_set :EP, SleepyPenguin::Epoll.new
36     Rainbows::Client.__send__ :include, Client
37   end
39   def worker_loop(worker) # :nodoc:
40     init_worker_process(worker)
41     Server.run
42   end
43 end