diff options
Diffstat (limited to 'lib/rainbows/epoll/server.rb')
-rw-r--r-- | lib/rainbows/epoll/server.rb | 14 |
1 files changed, 5 insertions, 9 deletions
diff --git a/lib/rainbows/epoll/server.rb b/lib/rainbows/epoll/server.rb index 1f61662..53b87ab 100644 --- a/lib/rainbows/epoll/server.rb +++ b/lib/rainbows/epoll/server.rb @@ -5,16 +5,12 @@ module Rainbows::Epoll::Server @@nr = 0 MAX = Rainbows.server.worker_connections THRESH = MAX - 1 - include Rainbows::Epoll::State LISTENERS = Rainbows::HttpServer::LISTENERS ReRun = [] - - def self.extended(obj) - obj.instance_variable_set(:@epoll_active, false) - end + EP = Rainbows::Epoll::EP def self.run - LISTENERS.each { |sock| sock.extend(self).epoll_enable(IN) } + LISTENERS.each { |sock| EP.add(sock.extend(self), IN) } begin EP.wait(nil, 1000) { |_, obj| obj.epoll_run } while obj = ReRun.shift @@ -28,16 +24,16 @@ module Rainbows::Epoll::Server # rearms all listeners when there's a free slot def self.decr - THRESH == (@@nr -= 1) and LISTENERS.each { |sock| sock.epoll_enable(IN) } + THRESH == (@@nr -= 1) and LISTENERS.each { |sock| EP.set(sock, IN) } end def epoll_run - return epoll_disable if @@nr >= MAX + return EP.delete(self) if @@nr >= MAX while io = kgio_tryaccept @@nr += 1 # there's a chance the client never even sees epoll for simple apps io.epoll_once - return epoll_disable if @@nr >= MAX + return EP.delete(self) if @@nr >= MAX end end end |