diff options
-rw-r--r-- | lib/yahns/server.rb | 32 | ||||
-rw-r--r-- | lib/yahns/server_mp.rb | 21 |
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 |