diff options
Diffstat (limited to 'lib/unicorn/socket_helper.rb')
-rw-r--r-- | lib/unicorn/socket_helper.rb | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/unicorn/socket_helper.rb b/lib/unicorn/socket_helper.rb index 2701d58..820b778 100644 --- a/lib/unicorn/socket_helper.rb +++ b/lib/unicorn/socket_helper.rb @@ -8,6 +8,7 @@ module Unicorn include Socket::Constants # prevents IO objects in here from being GC-ed + # kill this when we drop 1.8 support IO_PURGATORY = [] # internal interface, only used by Rainbows!/Zbatery @@ -59,6 +60,14 @@ module Unicorn end if defined?(SO_ACCEPTFILTER) end + def prevent_autoclose(io) + if io.respond_to?(:autoclose=) + io.autoclose = false + else + IO_PURGATORY << io + end + end + def set_tcp_sockopt(sock, opt) # just in case, even LANs can break sometimes. Linux sysadmins # can lower net.ipv4.tcp_keepalive_* sysctl knobs to very low values. @@ -174,7 +183,7 @@ module Unicorn sock.setsockopt(SOL_SOCKET, SO_REUSEPORT, 1) end sock.bind(Socket.pack_sockaddr_in(port, addr)) - IO_PURGATORY << sock + prevent_autoclose(sock) Kgio::TCPServer.for_fd(sock.fileno) end |