about summary refs log tree commit homepage
diff options
context:
space:
mode:
-rw-r--r--lib/yahns/server.rb32
-rw-r--r--lib/yahns/server_mp.rb21
2 files changed, 31 insertions, 22 deletions
diff --git a/lib/yahns/server.rb b/lib/yahns/server.rb
index 898be2c..9eb5378 100644
--- a/lib/yahns/server.rb
+++ b/lib/yahns/server.rb
@@ -412,6 +412,15 @@ class Yahns::Server # :nodoc:
     end
   end
 
+  def reap_reexec
+    @reexec_pid > 0 or return
+    wpid, status = Process.waitpid2(@reexec_pid, Process::WNOHANG)
+    wpid or return
+    @logger.error "reaped #{status.inspect} exec()-ed"
+    @reexec_pid = 0
+    self.pid = @pid.chomp('.oldbin') if @pid
+  end
+
   def sp_sig_handle(alive)
     @sev.kgio_wait_readable(alive ? nil : 0.01)
     @sev.yahns_step
@@ -419,7 +428,7 @@ class Yahns::Server # :nodoc:
     when :QUIT, :TERM, :INT
       return quit_enter(alive)
     when :CHLD
-      reap_all
+      reap_reexec
     when :USR1
       usr1_reopen('')
     when :USR2
@@ -456,25 +465,4 @@ class Yahns::Server # :nodoc:
   ensure
     quit_finish
   end
-
-  # reaps all unreaped workers/reexec processes
-  def reap_all
-    begin
-      wpid, status = Process.waitpid2(-1, Process::WNOHANG)
-      wpid or return
-      if @reexec_pid == wpid
-        @logger.error "reaped #{status.inspect} exec()-ed"
-        @reexec_pid = 0
-        self.pid = @pid.chomp('.oldbin') if @pid
-        proc_name('master') if @worker_processes
-      else
-        worker = @workers.delete(wpid)
-        desc = worker ? "worker=#{worker.nr}" : "(unknown)"
-        m = "reaped #{status.inspect} #{desc}"
-        status.success? ? @logger.info(m) : @logger.error(m)
-      end
-    rescue Errno::ECHILD
-      return
-    end while true
-  end
 end
diff --git a/lib/yahns/server_mp.rb b/lib/yahns/server_mp.rb
index 1e2f1c8..115f94a 100644
--- a/lib/yahns/server_mp.rb
+++ b/lib/yahns/server_mp.rb
@@ -164,4 +164,25 @@ module Yahns::ServerMP # :nodoc:
     end
     alive
   end
+
+  # reaps all unreaped workers/reexec processes
+  def reap_all
+    begin
+      wpid, status = Process.waitpid2(-1, Process::WNOHANG)
+      wpid or return
+      if @reexec_pid == wpid
+        @logger.error "reaped #{status.inspect} exec()-ed"
+        @reexec_pid = 0
+        self.pid = @pid.chomp('.oldbin') if @pid
+        proc_name('master')
+      else
+        worker = @workers.delete(wpid)
+        desc = worker ? "worker=#{worker.nr}" : "(unknown)"
+        m = "reaped #{status.inspect} #{desc}"
+        status.success? ? @logger.info(m) : @logger.error(m)
+      end
+    rescue Errno::ECHILD
+      return
+    end while true
+  end
 end