diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/rainbows.rb | 12 | ||||
-rw-r--r-- | lib/rainbows/thread_pool.rb | 3 | ||||
-rw-r--r-- | lib/rainbows/thread_spawn.rb | 5 |
3 files changed, 15 insertions, 5 deletions
diff --git a/lib/rainbows.rb b/lib/rainbows.rb index d3a3e7d..9260649 100644 --- a/lib/rainbows.rb +++ b/lib/rainbows.rb @@ -60,6 +60,13 @@ module Rainbows # returns nil if accept fails if defined?(Fcntl::FD_CLOEXEC) + def sync_accept(sock) + rv = sock.accept + rv.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) + rv + rescue Errno::EAGAIN, Errno::ECONNABORTED, Errno::EINTR + end + def accept(sock) rv = sock.accept_nonblock rv.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) @@ -67,6 +74,11 @@ module Rainbows rescue Errno::EAGAIN, Errno::ECONNABORTED end else + def sync_accept(sock) + sock.accept + rescue Errno::EAGAIN, Errno::ECONNABORTED, Errno::EINTR + end + def accept(sock) sock.accept_nonblock rescue Errno::EAGAIN, Errno::ECONNABORTED diff --git a/lib/rainbows/thread_pool.rb b/lib/rainbows/thread_pool.rb index 3ef719a..a68fcc6 100644 --- a/lib/rainbows/thread_pool.rb +++ b/lib/rainbows/thread_pool.rb @@ -44,8 +44,7 @@ module Rainbows def sync_worker s = LISTENERS.first begin - process_client(s.accept) - rescue Errno::EINTR, Errno::ECONNABORTED + c = Rainbows.sync_accept(s) and process_client(c) rescue => e Error.listen_loop(e) end while G.alive diff --git a/lib/rainbows/thread_spawn.rb b/lib/rainbows/thread_spawn.rb index eb3ca75..75cc150 100644 --- a/lib/rainbows/thread_spawn.rb +++ b/lib/rainbows/thread_spawn.rb @@ -34,8 +34,8 @@ module Rainbows # unlikely one. Since this case is (or should be) uncommon, # just busy wait when we have to. sleep(0.01) - else - klass.new(l.accept) do |c| + elsif c = Rainbows.sync_accept(l) + klass.new(c) do |c| begin lock.synchronize { G.cur += 1 } process_client(c) @@ -44,7 +44,6 @@ module Rainbows end end end - rescue Errno::EINTR, Errno::ECONNABORTED rescue => e Error.listen_loop(e) end while G.alive |