summaryrefslogtreecommitdiff
path: root/lib/drb/extservm.rb
diff options
context:
space:
mode:
authorseki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-11-19 18:30:18 +0000
committerseki <seki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2007-11-19 18:30:18 +0000
commit6591e380169e85e7764150e3a93722ca990ee05d (patch)
tree0bde2c4e556f097c722acb105260e716918190fb /lib/drb/extservm.rb
parent44b6b031bac42734d567b3adfefcaa80011fb039 (diff)
merged from ruby_1_8 branch.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13975 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'lib/drb/extservm.rb')
-rw-r--r--lib/drb/extservm.rb56
1 files changed, 24 insertions, 32 deletions
diff --git a/lib/drb/extservm.rb b/lib/drb/extservm.rb
index 1ede7d6d16..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,39 +34,28 @@ module DRb
attr_accessor :uri
def service(name)
- while true
- server = nil
- # TODO: YARV doesn't have Thread.exclusive
- #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
- # TODO: YARV doesn't have Thread.exclusive
- #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)
- # TODO: YARV doesn't have Thread.exclusive
- #Thread.exclusive do
+ synchronize do
@servers.delete(name)
- #end
+ end
end
private
@@ -76,22 +69,21 @@ module DRb
end
def invoke_service(name)
- Thread.critical = true
- @waiting.push Thread.current
- @queue.push name
- Thread.stop
+ @queue.push(name)
end
def invoke_service_command(name, command)
raise "invalid command. name: #{name}" unless command
- # TODO: YARV doesn't have Thread.exclusive
- #Thread.exclusive do
+ synchronize do
return if @servers.include?(name)
@servers[name] = false
- #end
+ end
uri = @uri || DRb.uri
- Process.detach(Process.spawn("#{command} #{uri} #{name}"))
- true
+ if RUBY_PLATFORM =~ /mswin32/ && /NT/ =~ ENV["OS"]
+ system(%Q'cmd /c start "ruby" /b #{command} #{uri} #{name}')
+ else
+ system("#{command} #{uri} #{name} &")
+ end
end
end
end