epoll/*: remove user-space array as active queue
authorEric Wong <normalperson@yhbt.net>
Tue, 26 Feb 2013 21:02:34 +0000 (26 21:02 +0000)
committerEric Wong <normalperson@yhbt.net>
Tue, 26 Feb 2013 21:05:55 +0000 (26 21:05 +0000)
This prevents pathological starvation cases where the user-space
ready-list can be repopulated infinitely.  With EPOLLONESHOT,
epoll itself may be used for this task (at a slightly higher
cost) by enabling read/write checks, as the epoll ready-list
preserves event ordering when used with EPOLLONESHOT.

lib/rainbows/epoll/client.rb
lib/rainbows/xepoll/client.rb

index f6af6fa..65fcb3e 100644 (file)
@@ -6,14 +6,14 @@ module Rainbows::Epoll::Client
   include Rainbows::EvCore
   APP = Rainbows.server.app
   Server = Rainbows::Epoll::Server
-  IN = SleepyPenguin::Epoll::IN | SleepyPenguin::Epoll::ET
-  OUT = SleepyPenguin::Epoll::OUT | SleepyPenguin::Epoll::ET
+  IN = SleepyPenguin::Epoll::IN | SleepyPenguin::Epoll::ONESHOT
+  OUT = SleepyPenguin::Epoll::OUT | SleepyPenguin::Epoll::ONESHOT
+  EPINOUT = IN | OUT
   KATO = {}
   KATO.compare_by_identity if KATO.respond_to?(:compare_by_identity)
   Rainbows.at_quit { KATO.each_key { |k| k.timeout! }.clear }
   Rainbows.config!(self, :keepalive_timeout)
   EP = Rainbows::EP
-  ReRun = []
   @@last_expire = Time.now
 
   def self.expire
@@ -28,9 +28,6 @@ module Rainbows::Epoll::Client
   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
@@ -140,7 +137,7 @@ module Rainbows::Epoll::Client
   end
 
   def want_more
-    ReRun << self
+    EP.set(self, EPINOUT)
   end
 
   def on_deferred_write_complete
index 4f15a73..f518db5 100644 (file)
@@ -27,9 +27,6 @@ module Rainbows::XEpoll::Client
   def self.loop
     begin
       EP.wait(nil, 1000) { |_, obj| obj.epoll_run }
-      while obj = ReRun.shift
-        obj.epoll_run
-      end
       Rainbows::Epoll::Client.expire
     rescue Errno::EINTR
     rescue => e