mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	invoke service subprocess. mark detach threads for clean up. * test/drb/drbtest.rb: clean up the service subprocess in teardown. * test/drb/test_drb.rb: set @service_name for teardown. * test/drb/test_drbunix.rb: ditto. * test/drb/test_drbssl.rb: ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@35424 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			93 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			1.7 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
=begin
 | 
						|
 external service manager
 | 
						|
        Copyright (c) 2000 Masatoshi SEKI
 | 
						|
=end
 | 
						|
 | 
						|
require 'drb/drb'
 | 
						|
require 'thread'
 | 
						|
require 'monitor'
 | 
						|
 | 
						|
module DRb
 | 
						|
  class ExtServManager
 | 
						|
    include DRbUndumped
 | 
						|
    include MonitorMixin
 | 
						|
 | 
						|
    @@command = {}
 | 
						|
 | 
						|
    def self.command
 | 
						|
      @@command
 | 
						|
    end
 | 
						|
 | 
						|
    def self.command=(cmd)
 | 
						|
      @@command = cmd
 | 
						|
    end
 | 
						|
 | 
						|
    def initialize
 | 
						|
      super()
 | 
						|
      @cond = new_cond
 | 
						|
      @servers = {}
 | 
						|
      @waiting = []
 | 
						|
      @queue = Queue.new
 | 
						|
      @thread = invoke_thread
 | 
						|
      @uri = nil
 | 
						|
    end
 | 
						|
    attr_accessor :uri
 | 
						|
 | 
						|
    def 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)
 | 
						|
      synchronize do
 | 
						|
        @servers[name] = ro
 | 
						|
        @cond.signal
 | 
						|
      end
 | 
						|
      self
 | 
						|
    end
 | 
						|
 | 
						|
    def unregist(name)
 | 
						|
      synchronize do
 | 
						|
        @servers.delete(name)
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    private
 | 
						|
    def invoke_thread
 | 
						|
      Thread.new do
 | 
						|
        while true
 | 
						|
          name = @queue.pop
 | 
						|
          invoke_service_command(name, @@command[name])
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    def invoke_service(name)
 | 
						|
      @queue.push(name)
 | 
						|
    end
 | 
						|
 | 
						|
    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
 | 
						|
  end
 | 
						|
end
 |