From ca1c3d41fa62bf15856a1c31156b60862616b3fa Mon Sep 17 00:00:00 2001 From: eregon Date: Tue, 12 Dec 2017 18:43:55 +0000 Subject: [PATCH] Avoid creating a Thread for shutting down a DRbServer * lib/drb/drb.rb: avoid creating a Thread and call the shutdown logic directly. Do not try to kill or join the current Thread. Thread.new { stop_service } caused "can't alloc thread (ThreadError)", which is shown with Thread.report_on_exception = true. [Bug #14171] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@61184 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- lib/drb/drb.rb | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/lib/drb/drb.rb b/lib/drb/drb.rb index 1d654b3c9f..3e2df7aafc 100644 --- a/lib/drb/drb.rb +++ b/lib/drb/drb.rb @@ -1466,12 +1466,7 @@ module DRb if Thread.current['DRb'] && Thread.current['DRb']['server'] == self Thread.current['DRb']['stop_service'] = true else - if @protocol.respond_to? :shutdown - @protocol.shutdown - else - [@thread, *@grp.list].each {|thread| thread.kill} # xxx: Thread#kill - end - @thread.join + shutdown end end @@ -1490,6 +1485,18 @@ module DRb private + def shutdown + current = Thread.current + if @protocol.respond_to? :shutdown + @protocol.shutdown + else + [@thread, *@grp.list].each { |thread| + thread.kill unless thread == current # xxx: Thread#kill + } + end + @thread.join unless @thread == current + end + ## # Starts the DRb main loop in a new thread. @@ -1671,9 +1678,7 @@ module DRb error_print(e) if verbose ensure client.close unless succ - if Thread.current['DRb']['stop_service'] - Thread.new { stop_service } - end + shutdown if Thread.current['DRb']['stop_service'] break unless succ end end