about summary refs log tree commit homepage
path: root/lib/unicorn/socket_helper.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/unicorn/socket_helper.rb')
-rw-r--r--lib/unicorn/socket_helper.rb11
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