|author||Eric Wong <email@example.com>||2015-05-07 20:24:18 +0000|
|committer||Eric Wong <firstname.lastname@example.org>||2015-05-07 20:26:44 +0000|
kgio_wait_readable is superior for single FDs in that it may use the ppoll syscall on Linux via Ruby, making it immune to the slowdown high FDs with select() and the array allocations enforced by the Ruby wrapper interface. Note: IO#wait in the io/wait stdlib has the same effect, but as of 2.2 still needlessly checks the FIONREAD ioctl. So avoid needing to force a new require on users which also incur shared object loading costs. The longer term plan is to rely entirely on Ruby IO primitives entirely and drop kgio, but that won't happen until we can depend on Ruby 2.3 for exception-free accept_nonblock (which will be released December 2015).
1 files changed, 1 insertions, 1 deletions
diff --git a/lib/unicorn/http_server.rb b/lib/unicorn/http_server.rb
index a726c91..82747b8 100644
@@ -369,7 +369,7 @@ class Unicorn::HttpServer
# wait for a signal hander to wake us up and then consume the pipe
- IO.select([ @self_pipe ], nil, nil, sec) or return
+ @self_pipe.kgio_wait_readable(sec) or return
# 11 bytes is the maximum string length which can be embedded within
# the Ruby itself and not require a separate malloc (on 32-bit MRI 1.9+).
# Most reads are only one byte here and uncommon, so it's not worth a