diff options
author | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-12-12 18:43:55 +0000 |
---|---|---|
committer | eregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2017-12-12 18:43:55 +0000 |
commit | ca1c3d41fa62bf15856a1c31156b60862616b3fa (patch) | |
tree | c0110845b3915a4c2354d6d56634f4dd074557dc /lib | |
parent | 5a3c024df0a83d1f64f10f028f1082e67f88c013 (diff) | |
download | ruby-ca1c3d41fa62bf15856a1c31156b60862616b3fa.tar.gz |
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
Diffstat (limited to 'lib')
-rw-r--r-- | lib/drb/drb.rb | 23 |
1 files 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 |