Line | |
---|
1 | =begin
|
---|
2 | external service manager
|
---|
3 | Copyright (c) 2000 Masatoshi SEKI
|
---|
4 | =end
|
---|
5 |
|
---|
6 | require 'drb/drb'
|
---|
7 | require 'thread'
|
---|
8 |
|
---|
9 | module 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
|
---|
96 | end
|
---|
Note:
See
TracBrowser
for help on using the repository browser.