source: extensions/gsdl-video/trunk/installed/cmdline/lib/ruby/1.8/drb/extservm.rb@ 18425

Last change on this file since 18425 was 18425, checked in by davidb, 15 years ago

Video extension to Greenstone

File size: 1.7 KB
Line 
1=begin
2 external service manager
3 Copyright (c) 2000 Masatoshi SEKI
4=end
5
6require 'drb/drb'
7require 'thread'
8
9module DRb
10 class ExtServManager
11 include DRbUndumped
12
13 @@command = {}
14
15 def self.command
16 @@command
17 end
18
19 def self.command=(cmd)
20 @@command = cmd
21 end
22
23 def initialize
24 @servers = {}
25 @waiting = []
26 @queue = Queue.new
27 @thread = invoke_thread
28 @uri = nil
29 end
30 attr_accessor :uri
31
32 def service(name)
33 while true
34 server = nil
35 Thread.exclusive do
36 server = @servers[name] if @servers[name]
37 end
38 return server if server && server.alive?
39 invoke_service(name)
40 end
41 end
42
43 def regist(name, ro)
44 ary = nil
45 Thread.exclusive do
46 @servers[name] = ro
47 ary = @waiting
48 @waiting = []
49 end
50 ary.each do |th|
51 begin
52 th.run
53 rescue ThreadError
54 end
55 end
56 self
57 end
58
59 def unregist(name)
60 Thread.exclusive do
61 @servers.delete(name)
62 end
63 end
64
65 private
66 def invoke_thread
67 Thread.new do
68 while true
69 name = @queue.pop
70 invoke_service_command(name, @@command[name])
71 end
72 end
73 end
74
75 def invoke_service(name)
76 Thread.critical = true
77 @waiting.push Thread.current
78 @queue.push name
79 Thread.stop
80 end
81
82 def invoke_service_command(name, command)
83 raise "invalid command. name: #{name}" unless command
84 Thread.exclusive do
85 return if @servers.include?(name)
86 @servers[name] = false
87 end
88 uri = @uri || DRb.uri
89 if RUBY_PLATFORM =~ /mswin32/ && /NT/ =~ ENV["OS"]
90 system(%Q'cmd /c start "ruby" /b #{command} #{uri} #{name}')
91 else
92 system("#{command} #{uri} #{name} &")
93 end
94 end
95 end
96end
Note: See TracBrowser for help on using the repository browser.