class DRb::ExtServManager

Attributes

uri[RW]

Public Class Methods

command() click to toggle source
# File lib/drb/extservm.rb, line 17
def self.command
 @@command
end
command=(cmd) click to toggle source
# File lib/drb/extservm.rb, line 21
def self.command=(cmd)
 @@command = cmd
end
new() click to toggle source
Calls superclass method MonitorMixin.new
# File lib/drb/extservm.rb, line 25
def initialize
 super()
 @cond = new_cond
 @servers = {}
 @waiting = []
 @queue = Queue.new
 @thread = invoke_thread
 @uri = nil
end

Public Instance Methods

regist(name, ro) click to toggle source
# File lib/drb/extservm.rb, line 47
def regist(name, ro)
 synchronize do
 @servers[name] = ro
 @cond.signal
 end
 self
end
service(name) click to toggle source
# File lib/drb/extservm.rb, line 36
def service(name)
 synchronize do
 while true
 server = @servers[name]
 return server if server && server.alive?
 invoke_service(name)
 @cond.wait
 end
 end
end
unregist(name) click to toggle source
# File lib/drb/extservm.rb, line 55
def unregist(name)
 synchronize do
 @servers.delete(name)
 end
end

Private Instance Methods

invoke_service(name) click to toggle source
# File lib/drb/extservm.rb, line 71
def invoke_service(name)
 @queue.push(name)
end
invoke_service_command(name, command) click to toggle source
# File lib/drb/extservm.rb, line 75
def invoke_service_command(name, command)
 raise "invalid command. name: #{name}" unless command
 synchronize do
 return if @servers.include?(name)
 @servers[name] = false
 end
 uri = @uri || DRb.uri
 if command.respond_to? :to_ary
 command = command.to_ary + [uri, name]
 pid = spawn(*command)
 else
 pid = spawn("#{command} #{uri} #{name}")
 end
 th = Process.detach(pid)
 th[:drb_service] = name
 th
end
invoke_thread() click to toggle source
# File lib/drb/extservm.rb, line 62
def invoke_thread
 Thread.new do
 while true
 name = @queue.pop
 invoke_service_command(name, @@command[name])
 end
 end
end