diff options
author | seki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-11-13 13:04:30 +0000 |
---|---|---|
committer | seki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2007-11-13 13:04:30 +0000 |
commit | e46a7bd93a7450907530345bf1323144e2bfd317 (patch) | |
tree | 5e9d9f21990d64a6923e0b0c5234a8055fca86d3 /lib/drb | |
parent | 4e0ac23588e805fa4457878c5523fd7ed3367d40 (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/drb')
-rw-r--r-- | lib/drb/drb.rb | 10 | ||||
-rw-r--r-- | lib/drb/extservm.rb | 42 |
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 |