about summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2011-02-05 10:11:56 +0000
committerEric Wong <normalperson@yhbt.net>2011-02-05 10:11:56 +0000
commitc9ca82c76f1eb0e06b0aa204a243d00f382579c5 (patch)
tree4ca29dd42f3114c89b31022b993c38247fd0fe98
parentd8e3edadd128a2ee5712b87a6b660295de2df6be (diff)
downloadrainbows-c9ca82c76f1eb0e06b0aa204a243d00f382579c5.tar.gz
There's a lot of code duplication here :<
-rw-r--r--lib/rainbows/epoll.rb7
-rw-r--r--lib/rainbows/epoll/client.rb2
-rw-r--r--lib/rainbows/epoll/server.rb5
-rw-r--r--lib/rainbows/xepoll/client.rb1
4 files changed, 10 insertions, 5 deletions
diff --git a/lib/rainbows/epoll.rb b/lib/rainbows/epoll.rb
index c8c013e..b567142 100644
--- a/lib/rainbows/epoll.rb
+++ b/lib/rainbows/epoll.rb
@@ -7,11 +7,18 @@ require 'sendfile'
 # and optimized for throughput at the expense of fairness
 module Rainbows::Epoll
   include Rainbows::Base
+  ReRun = []
   autoload :Server, 'rainbows/epoll/server'
   autoload :Client, 'rainbows/epoll/client'
   autoload :ResponsePipe, 'rainbows/epoll/response_pipe'
   autoload :ResponseChunkPipe, 'rainbows/epoll/response_chunk_pipe'
 
+  def self.rerun
+    while obj = ReRun.shift
+      obj.epoll_run
+    end
+  end
+
   def init_worker_process(worker)
     super
     Rainbows::Epoll.const_set :EP, SleepyPenguin::Epoll.new
diff --git a/lib/rainbows/epoll/client.rb b/lib/rainbows/epoll/client.rb
index a8eacab..a243d5d 100644
--- a/lib/rainbows/epoll/client.rb
+++ b/lib/rainbows/epoll/client.rb
@@ -100,7 +100,7 @@ module Rainbows::Epoll::Client
   end
 
   def want_more
-    Server::ReRun << self
+    Rainbows::Epoll::ReRun << self
   end
 
   def on_deferred_write_complete
diff --git a/lib/rainbows/epoll/server.rb b/lib/rainbows/epoll/server.rb
index 820a6da..a8be3e2 100644
--- a/lib/rainbows/epoll/server.rb
+++ b/lib/rainbows/epoll/server.rb
@@ -6,16 +6,13 @@ module Rainbows::Epoll::Server
   MAX = Rainbows.server.worker_connections
   THRESH = MAX - 1
   LISTENERS = Rainbows::HttpServer::LISTENERS
-  ReRun = []
   EP = Rainbows::Epoll::EP
 
   def self.run
     LISTENERS.each { |sock| EP.add(sock.extend(self), IN) }
     begin
       EP.wait(nil, 1000) { |_, obj| obj.epoll_run }
-      while obj = ReRun.shift
-        obj.epoll_run
-      end
+      Rainbows::Epoll.rerun
       Rainbows::Epoll::Client.expire
     rescue Errno::EINTR
     rescue => e
diff --git a/lib/rainbows/xepoll/client.rb b/lib/rainbows/xepoll/client.rb
index fa5999b..2db684e 100644
--- a/lib/rainbows/xepoll/client.rb
+++ b/lib/rainbows/xepoll/client.rb
@@ -27,6 +27,7 @@ module Rainbows::XEpoll::Client
     THREADS.each { |t| t.run }
     begin
       EP.wait(nil, @timeout) { |flags, obj| obj.epoll_run }
+      Rainbows::Epoll.rerun
       Rainbows::Epoll::Client.expire
     rescue Errno::EINTR
     rescue => e