summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorseki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-11-13 13:04:30 +0000
committerseki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-11-13 13:04:30 +0000
commite46a7bd93a7450907530345bf1323144e2bfd317 (patch)
tree5e9d9f21990d64a6923e0b0c5234a8055fca86d3 /lib
parent4e0ac23588e805fa4457878c5523fd7ed3367d40 (diff)
remove Thread.exclusive
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8@13909 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib')
-rw-r--r--lib/drb/drb.rb10
-rw-r--r--lib/drb/extservm.rb42
2 files changed, 25 insertions, 27 deletions
diff --git a/lib/drb/drb.rb b/lib/drb/drb.rb
index 2fa15445ef..20e658e611 100644
--- a/lib/drb/drb.rb
+++ b/lib/drb/drb.rb
@@ -578,7 +578,7 @@ module DRb
end
raise(DRbConnError, 'connection closed') if str.nil?
raise(DRbConnError, 'premature marshal format(can\'t read)') if str.size < sz
- Thread.exclusive do
+ DRb.mutex.synchronize do
begin
save = Thread.current[:drb_untaint]
Thread.current[:drb_untaint] = []
@@ -1751,10 +1751,16 @@ module DRb
end
module_function :install_acl
+ @mutex = Mutex.new
+ def mutex
+ @mutex
+ end
+ module_function :mutex
+
@server = {}
def regist_server(server)
@server[server.uri] = server
- Thread.exclusive do
+ mutex.synchronize do
@primary_server = server unless @primary_server
end
end
diff --git a/lib/drb/extservm.rb b/lib/drb/extservm.rb
index 91cbc3180f..be40aea9f5 100644
--- a/lib/drb/extservm.rb
+++ b/lib/drb/extservm.rb
@@ -5,10 +5,12 @@
require 'drb/drb'
require 'thread'
+require 'monitor'
module DRb
class ExtServManager
include DRbUndumped
+ include MonitorMixin
@@command = {}
@@ -21,6 +23,8 @@ module DRb
end
def initialize
+ super()
+ @cond = new_cond
@servers = {}
@waiting = []
@queue = Queue.new
@@ -30,34 +34,26 @@ module DRb
attr_accessor :uri
def service(name)
- while true
- server = nil
- Thread.exclusive do
- server = @servers[name] if @servers[name]
- end
- return server if server && server.alive?
- invoke_service(name)
+ synchronize do
+ while true
+ server = @servers[name]
+ return server if server && server.alive?
+ invoke_service(name)
+ @cond.wait
+ end
end
end
def regist(name, ro)
- ary = nil
- Thread.exclusive do
- @servers[name] = ro
- ary = @waiting
- @waiting = []
- end
- ary.each do |th|
- begin
- th.run
- rescue ThreadError
- end
+ synchronize do
+ @servers[name] = ro
+ @cond.signal
end
self
end
def unregist(name)
- Thread.exclusive do
+ synchronize do
@servers.delete(name)
end
end
@@ -73,16 +69,12 @@ module DRb
end
def invoke_service(name)
- Thread.exclusive do
- @waiting.push Thread.current
- @queue.push name
- Thread.stop
- end
+ @queue.push(name)
end
def invoke_service_command(name, command)
raise "invalid command. name: #{name}" unless command
- Thread.exclusive do
+ synchronize do
return if @servers.include?(name)
@servers[name] = false
end