summaryrefslogtreecommitdiff
path: root/lib/drb
diff options
context:
space:
mode:
authoreregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-12-12 18:43:55 +0000
committereregon <eregon@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2017-12-12 18:43:55 +0000
commitca1c3d41fa62bf15856a1c31156b60862616b3fa (patch)
treec0110845b3915a4c2354d6d56634f4dd074557dc /lib/drb
parent5a3c024df0a83d1f64f10f028f1082e67f88c013 (diff)
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/drb')
-rw-r--r--lib/drb/drb.rb23
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