about summary refs log tree commit homepage
path: root/lib/unicorn.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/unicorn.rb')
-rw-r--r--lib/unicorn.rb17
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/unicorn.rb b/lib/unicorn.rb
index 02419e7..2883bc2 100644
--- a/lib/unicorn.rb
+++ b/lib/unicorn.rb
@@ -105,16 +105,25 @@ module Unicorn
     # replaces current listener set with +listeners+.  This will
     # close the socket if it will not exist in the new listener set
     def listeners=(listeners)
-      cur_names = listener_names
+      cur_names, dead_names = [], []
+      listener_names.each do |name|
+        if "/" == name[0..0]
+          # mark unlinked sockets as dead so we can rebind them
+          (File.socket?(name) ? cur_names : dead_names) << name
+        else
+          cur_names << name
+        end
+      end
       set_names = listener_names(listeners)
-      dead_names = cur_names - set_names
+      dead_names += cur_names - set_names
+      dead_names.uniq!
 
       @listeners.delete_if do |io|
         if dead_names.include?(sock_name(io))
           @io_purgatory.delete_if do |pio|
-            pio.fileno == io.fileno && (pio.close rescue nil).nil?
+            pio.fileno == io.fileno && (pio.close rescue nil).nil? # true
           end
-          (io.close rescue nil).nil?
+          (io.close rescue nil).nil? # true
         else
           false
         end