about summary refs log tree commit homepage
path: root/lib/rainbows/epoll/client.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rainbows/epoll/client.rb')
-rw-r--r--lib/rainbows/epoll/client.rb18
1 files changed, 16 insertions, 2 deletions
diff --git a/lib/rainbows/epoll/client.rb b/lib/rainbows/epoll/client.rb
index 0d6a8c0..e23d4e7 100644
--- a/lib/rainbows/epoll/client.rb
+++ b/lib/rainbows/epoll/client.rb
@@ -11,7 +11,8 @@ module Rainbows::Epoll::Client
   KATO = {}
   KATO.compare_by_identity if KATO.respond_to?(:compare_by_identity)
   Rainbows.config!(self, :keepalive_timeout)
-  EP = Rainbows::Epoll::EP
+  EP = Rainbows::EP
+  ReRun = []
   @@last_expire = Time.now
 
   def self.expire
@@ -23,6 +24,19 @@ module Rainbows::Epoll::Client
     @@last_expire = now
   end
 
+  def self.loop
+    begin
+      EP.wait(nil, 1000) { |_, obj| obj.epoll_run }
+      while obj = ReRun.shift
+        obj.epoll_run
+      end
+      expire
+    rescue Errno::EINTR
+    rescue => e
+      Rainbows::Error.listen_loop(e)
+    end while Rainbows.tick || Server.nr > 0
+  end
+
   # only call this once
   def epoll_once
     @wr_queue = [] # may contain String, ResponsePipe, and StreamFile objects
@@ -100,7 +114,7 @@ module Rainbows::Epoll::Client
   end
 
   def want_more
-    Rainbows::Epoll::ReRun << self
+    ReRun << self
   end
 
   def on_deferred_write_complete