gisele-vm 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. data/CHANGELOG.md +5 -0
  2. data/Gemfile +18 -0
  3. data/Gemfile.lock +46 -0
  4. data/LICENCE.md +22 -0
  5. data/Manifest.txt +15 -0
  6. data/README.md +10 -0
  7. data/Rakefile +11 -0
  8. data/bin/gvm +9 -0
  9. data/gisele-vm.gemspec +191 -0
  10. data/gisele-vm.noespec +31 -0
  11. data/lib/gisele-vm.rb +4 -0
  12. data/lib/gisele-vm/loader.rb +5 -0
  13. data/lib/gisele-vm/version.rb +16 -0
  14. data/lib/gisele/compiling.rb +3 -0
  15. data/lib/gisele/compiling/gisele2gts.rb +143 -0
  16. data/lib/gisele/compiling/gts.rb +74 -0
  17. data/lib/gisele/compiling/gts2bytecode.rb +127 -0
  18. data/lib/gisele/vm.rb +87 -0
  19. data/lib/gisele/vm/bytecode.rb +84 -0
  20. data/lib/gisele/vm/bytecode/builder.rb +77 -0
  21. data/lib/gisele/vm/bytecode/grammar.citrus +116 -0
  22. data/lib/gisele/vm/bytecode/grammar.rb +19 -0
  23. data/lib/gisele/vm/bytecode/grammar.sexp.yml +113 -0
  24. data/lib/gisele/vm/bytecode/printer.rb +35 -0
  25. data/lib/gisele/vm/command.rb +140 -0
  26. data/lib/gisele/vm/component.rb +91 -0
  27. data/lib/gisele/vm/console.rb +58 -0
  28. data/lib/gisele/vm/enacter.rb +29 -0
  29. data/lib/gisele/vm/errors.rb +26 -0
  30. data/lib/gisele/vm/event.rb +11 -0
  31. data/lib/gisele/vm/event_manager.rb +65 -0
  32. data/lib/gisele/vm/kernel.rb +58 -0
  33. data/lib/gisele/vm/kernel/macros.gvm +214 -0
  34. data/lib/gisele/vm/kernel/opcodes.rb +212 -0
  35. data/lib/gisele/vm/kernel/runner.rb +63 -0
  36. data/lib/gisele/vm/lifecycle.rb +72 -0
  37. data/lib/gisele/vm/logging.rb +18 -0
  38. data/lib/gisele/vm/null_object.rb +19 -0
  39. data/lib/gisele/vm/prog.rb +63 -0
  40. data/lib/gisele/vm/prog_list.rb +55 -0
  41. data/lib/gisele/vm/prog_list/memory.rb +74 -0
  42. data/lib/gisele/vm/prog_list/sqldb.rb +123 -0
  43. data/lib/gisele/vm/prog_list/storage.rb +31 -0
  44. data/lib/gisele/vm/proxy.rb +14 -0
  45. data/lib/gisele/vm/proxy/client.rb +64 -0
  46. data/lib/gisele/vm/proxy/server.rb +29 -0
  47. data/lib/gisele/vm/registry.rb +57 -0
  48. data/lib/gisele/vm/robustness.rb +31 -0
  49. data/lib/gisele/vm/simulator/resumer.rb +32 -0
  50. data/spec/command/gvm_compile.cmd +1 -0
  51. data/spec/command/gvm_compile.stdout +111 -0
  52. data/spec/command/gvm_gts.cmd +1 -0
  53. data/spec/command/gvm_gts.stdout +101 -0
  54. data/spec/command/gvm_help.cmd +1 -0
  55. data/spec/command/gvm_help.stdout +30 -0
  56. data/spec/command/gvm_version.cmd +1 -0
  57. data/spec/command/gvm_version.stdout +2 -0
  58. data/spec/command/test_command.rb +29 -0
  59. data/spec/fixtures/complete.gis +13 -0
  60. data/spec/fixtures/fake_component.rb +24 -0
  61. data/spec/fixtures/kernel.rb +39 -0
  62. data/spec/fixtures/ts.adl +11 -0
  63. data/spec/fixtures/ts.gts +20 -0
  64. data/spec/fixtures/ts.gvm +19 -0
  65. data/spec/spec_helper.rb +86 -0
  66. data/spec/test_examples.rb +29 -0
  67. data/spec/test_gisele-vm.rb +8 -0
  68. data/spec/unit/bytecode/builder/test_at.rb +56 -0
  69. data/spec/unit/bytecode/builder/test_helpers.rb +36 -0
  70. data/spec/unit/bytecode/builder/test_instruction.rb +35 -0
  71. data/spec/unit/bytecode/builder/test_to_a.rb +53 -0
  72. data/spec/unit/bytecode/bytecode.gvm +1 -0
  73. data/spec/unit/bytecode/grammar/fixtures/comments.gvm +16 -0
  74. data/spec/unit/bytecode/grammar/fixtures/every.gvm +46 -0
  75. data/spec/unit/bytecode/grammar/fixtures/singleblock.gvm +2 -0
  76. data/spec/unit/bytecode/grammar/fixtures/twoblocks.gvm +4 -0
  77. data/spec/unit/bytecode/grammar/fixtures/with_end.gvm +5 -0
  78. data/spec/unit/bytecode/grammar/test_array.rb +24 -0
  79. data/spec/unit/bytecode/grammar/test_block.rb +35 -0
  80. data/spec/unit/bytecode/grammar/test_boolean.rb +20 -0
  81. data/spec/unit/bytecode/grammar/test_constant.rb +20 -0
  82. data/spec/unit/bytecode/grammar/test_eol.rb +20 -0
  83. data/spec/unit/bytecode/grammar/test_eol_comment.rb +36 -0
  84. data/spec/unit/bytecode/grammar/test_file.rb +38 -0
  85. data/spec/unit/bytecode/grammar/test_hash.rb +33 -0
  86. data/spec/unit/bytecode/grammar/test_instruction.rb +32 -0
  87. data/spec/unit/bytecode/grammar/test_int.rb +24 -0
  88. data/spec/unit/bytecode/grammar/test_label.rb +24 -0
  89. data/spec/unit/bytecode/grammar/test_opcode.rb +23 -0
  90. data/spec/unit/bytecode/grammar/test_string.rb +25 -0
  91. data/spec/unit/bytecode/grammar/test_symbol.rb +30 -0
  92. data/spec/unit/bytecode/test_build.rb +36 -0
  93. data/spec/unit/bytecode/test_coerce.rb +41 -0
  94. data/spec/unit/bytecode/test_fetch.rb +20 -0
  95. data/spec/unit/bytecode/test_grammar.rb +30 -0
  96. data/spec/unit/bytecode/test_parse.rb +22 -0
  97. data/spec/unit/bytecode/test_plus.rb +27 -0
  98. data/spec/unit/bytecode/test_to_a.rb +19 -0
  99. data/spec/unit/bytecode/test_to_s.rb +32 -0
  100. data/spec/unit/command/code.gis +3 -0
  101. data/spec/unit/command/test_vm.rb +51 -0
  102. data/spec/unit/compiling/gisele2gts/test_on_par_st.rb +51 -0
  103. data/spec/unit/compiling/gisele2gts/test_on_seq_st.rb +46 -0
  104. data/spec/unit/compiling/gisele2gts/test_on_task_call_st.rb +37 -0
  105. data/spec/unit/compiling/gisele2gts/test_on_task_def.rb +49 -0
  106. data/spec/unit/compiling/gisele2gts/test_on_unit_def.rb +35 -0
  107. data/spec/unit/compiling/gts2bytecode/test_on_end.rb +31 -0
  108. data/spec/unit/compiling/gts2bytecode/test_on_event.rb +37 -0
  109. data/spec/unit/compiling/gts2bytecode/test_on_fork.rb +41 -0
  110. data/spec/unit/compiling/gts2bytecode/test_on_join.rb +42 -0
  111. data/spec/unit/compiling/gts2bytecode/test_on_listen.rb +36 -0
  112. data/spec/unit/compiling/gts2bytecode/test_on_nop.rb +30 -0
  113. data/spec/unit/component/test_component_name.rb +16 -0
  114. data/spec/unit/component/test_logging.rb +36 -0
  115. data/spec/unit/enacter/test_component.rb +11 -0
  116. data/spec/unit/event/test_to_s.rb +12 -0
  117. data/spec/unit/event_manager/test_component.rb +9 -0
  118. data/spec/unit/event_manager/test_subscribe.rb +40 -0
  119. data/spec/unit/event_manager/test_unsubscribe.rb +39 -0
  120. data/spec/unit/kernel/macros/test_fork.rb +37 -0
  121. data/spec/unit/kernel/macros/test_join.rb +43 -0
  122. data/spec/unit/kernel/macros/test_listen.rb +37 -0
  123. data/spec/unit/kernel/macros/test_notify.rb +57 -0
  124. data/spec/unit/kernel/macros/test_react.rb +47 -0
  125. data/spec/unit/kernel/macros/test_schedule_at.rb +30 -0
  126. data/spec/unit/kernel/opcodes/test_op_del.rb +42 -0
  127. data/spec/unit/kernel/opcodes/test_op_event.rb +25 -0
  128. data/spec/unit/kernel/opcodes/test_op_fetch.rb +27 -0
  129. data/spec/unit/kernel/opcodes/test_op_flip.rb +17 -0
  130. data/spec/unit/kernel/opcodes/test_op_fold.rb +29 -0
  131. data/spec/unit/kernel/opcodes/test_op_fork.rb +63 -0
  132. data/spec/unit/kernel/opcodes/test_op_forka.rb +51 -0
  133. data/spec/unit/kernel/opcodes/test_op_get.rb +62 -0
  134. data/spec/unit/kernel/opcodes/test_op_getr.rb +48 -0
  135. data/spec/unit/kernel/opcodes/test_op_ifenil.rb +41 -0
  136. data/spec/unit/kernel/opcodes/test_op_ifezero.rb +32 -0
  137. data/spec/unit/kernel/opcodes/test_op_invoke.rb +34 -0
  138. data/spec/unit/kernel/opcodes/test_op_nop.rb +18 -0
  139. data/spec/unit/kernel/opcodes/test_op_parent.rb +39 -0
  140. data/spec/unit/kernel/opcodes/test_op_pop.rb +22 -0
  141. data/spec/unit/kernel/opcodes/test_op_push.rb +17 -0
  142. data/spec/unit/kernel/opcodes/test_op_save.rb +32 -0
  143. data/spec/unit/kernel/opcodes/test_op_savea.rb +34 -0
  144. data/spec/unit/kernel/opcodes/test_op_self.rb +20 -0
  145. data/spec/unit/kernel/opcodes/test_op_send.rb +20 -0
  146. data/spec/unit/kernel/opcodes/test_op_set.rb +61 -0
  147. data/spec/unit/kernel/opcodes/test_op_then.rb +50 -0
  148. data/spec/unit/kernel/opcodes/test_op_unfold.rb +22 -0
  149. data/spec/unit/kernel/opcodes/test_op_uuid.rb +16 -0
  150. data/spec/unit/kernel/runner/test_pop.rb +26 -0
  151. data/spec/unit/kernel/runner/test_stack.rb +28 -0
  152. data/spec/unit/kernel/test_progress.rb +47 -0
  153. data/spec/unit/kernel/test_resume.rb +53 -0
  154. data/spec/unit/kernel/test_start.rb +36 -0
  155. data/spec/unit/prog/test_to_hash.rb +29 -0
  156. data/spec/unit/prog/test_waitlist_eq.rb +20 -0
  157. data/spec/unit/prog_list/memory/test_component.rb +9 -0
  158. data/spec/unit/prog_list/memory/test_fetch.rb +40 -0
  159. data/spec/unit/prog_list/memory/test_pick.rb +39 -0
  160. data/spec/unit/prog_list/memory/test_save.rb +91 -0
  161. data/spec/unit/prog_list/memory/test_to_relation.rb +17 -0
  162. data/spec/unit/prog_list/sqldb/test_component.rb +11 -0
  163. data/spec/unit/prog_list/sqldb/test_connect.rb +46 -0
  164. data/spec/unit/prog_list/test_memory.rb +9 -0
  165. data/spec/unit/prog_list/test_sqldb.rb +13 -0
  166. data/spec/unit/prog_list/test_storage.rb +51 -0
  167. data/spec/unit/registry/test_component.rb +9 -0
  168. data/spec/unit/registry/test_connect.rb +53 -0
  169. data/spec/unit/registry/test_disconnect.rb +51 -0
  170. data/spec/unit/registry/test_registration.rb +44 -0
  171. data/spec/unit/shared/a_component.rb +49 -0
  172. data/spec/unit/shared/a_storage.rb +114 -0
  173. data/spec/unit/test_logging.rb +46 -0
  174. data/spec/unit/test_prog.rb +57 -0
  175. data/spec/unit/test_prog_list.rb +22 -0
  176. data/spec/unit/vm/test_event_facace.rb +11 -0
  177. data/spec/unit/vm/test_initialize.rb +59 -0
  178. data/spec/unit/vm/test_proglist_facade.rb +21 -0
  179. data/tasks/debug_mail.rake +75 -0
  180. data/tasks/debug_mail.txt +13 -0
  181. data/tasks/gem.rake +73 -0
  182. data/tasks/spec_test.rake +71 -0
  183. data/tasks/unit_test.rake +76 -0
  184. data/tasks/yard.rake +51 -0
  185. metadata +493 -0
@@ -0,0 +1,55 @@
1
+ module Gisele
2
+ class VM
3
+ class ProgList < Component
4
+ extend Forwardable
5
+
6
+ def initialize(storage)
7
+ super()
8
+ @storage = storage
9
+ end
10
+
11
+ def self.memory
12
+ ProgList.new storage("memory")
13
+ end
14
+
15
+ def self.storage(options = nil)
16
+ options = {:uri => "memory"} unless options
17
+ options = {:uri => options } unless Hash===options
18
+ options[:uri] = "memory" unless options[:uri]
19
+ options[:uri] = "#{Sqldb.sqlite_protocol}:memory" if options[:uri]=='memory'
20
+ ProgList::Sqldb.new(options)
21
+ end
22
+
23
+ def registered(vm)
24
+ super
25
+ @storage.registered(vm)
26
+ end
27
+
28
+ def unregistered
29
+ super
30
+ @storage.unregistered
31
+ end
32
+
33
+ def connect
34
+ super
35
+ @storage.connect
36
+ end
37
+
38
+ def disconnect
39
+ super
40
+ @storage.disconnect
41
+ end
42
+
43
+ def_delegators :"@storage", :options,
44
+ :fetch,
45
+ :pick,
46
+ :save,
47
+ :clear,
48
+ :to_relation
49
+
50
+ end # class ProgList
51
+ end # class VM
52
+ end # module Gisele
53
+ require_relative 'prog_list/storage'
54
+ require_relative 'prog_list/memory'
55
+ require_relative 'prog_list/sqldb'
@@ -0,0 +1,74 @@
1
+ module Gisele
2
+ class VM
3
+ class ProgList
4
+ class Memory < Storage
5
+
6
+ def initialize(options = {})
7
+ super
8
+ @progs = []
9
+ end
10
+
11
+ def fetch(puid)
12
+ @progs[is_a_valid_puid!(puid)].dup
13
+ end
14
+
15
+ def pick(restriction, &bl)
16
+ keys = restriction.keys
17
+ candidate = @progs.select{|p|
18
+ p.to_hash(keys) == restriction
19
+ }.sample
20
+ bl.call if bl and candidate.nil?
21
+ candidate
22
+ end
23
+
24
+ def clear
25
+ @progs = []
26
+ end
27
+
28
+ def to_relation(restriction = nil)
29
+ progs = @progs
30
+ if restriction
31
+ keys = restriction.keys
32
+ progs = progs.select{|p| p.to_hash(keys) == restriction}
33
+ end
34
+ progs = progs.map{|p| p.to_hash}
35
+ Alf::Relation(progs)
36
+ end
37
+
38
+ private
39
+
40
+ def save_prog(prog)
41
+ prog.puid.tap{|puid|
42
+ @progs[is_a_valid_puid!(puid)] = prog.dup
43
+ }
44
+ end
45
+
46
+ def register_prog(prog)
47
+ @progs << prog.dup.tap{|d|
48
+ d.puid = @progs.size
49
+ d.parent = d.puid if d.parent.nil?
50
+ d.root = d.puid if d.root.nil?
51
+ }
52
+ @progs.last.puid
53
+ end
54
+
55
+ def is_a_valid_puid!(puid)
56
+ case puid
57
+ when /^\d+$/
58
+ is_a_valid_puid! Integer(puid)
59
+ else
60
+ unless valid_puid?(puid)
61
+ raise InvalidPUIDError, "Invalid puid: `#{puid.inspect}`"
62
+ end
63
+ puid
64
+ end
65
+ end
66
+
67
+ def valid_puid?(puid)
68
+ (Integer===puid) and (0 <= puid) and (puid < @progs.size)
69
+ end
70
+
71
+ end # class Memory
72
+ end # class ProgList
73
+ end # class VM
74
+ end # module Gisele
@@ -0,0 +1,123 @@
1
+ require 'sequel'
2
+ module Gisele
3
+ class VM
4
+ class ProgList
5
+ class Sqldb < Storage
6
+
7
+ attr_reader :sequel_db
8
+
9
+ def initialize(options = {})
10
+ super(default_options.merge(options))
11
+ end
12
+
13
+ def default_options
14
+ { :table_name => :gvm_proglist }
15
+ end
16
+
17
+ def self.sqlite_protocol
18
+ defined?(JRUBY_VERSION) ? "jdbc:sqlite" : "sqlite"
19
+ end
20
+
21
+ def connect
22
+ super
23
+ @sequel_db = Sequel.connect(connection_info)
24
+ @sequel_db.test_connection
25
+ ensure_schema(@sequel_db)
26
+ self
27
+ end
28
+
29
+ def disconnect
30
+ super
31
+ @sequel_db.disconnect if @sequel_db
32
+ end
33
+
34
+ def fetch(puid)
35
+ got = sequel_db[table_name].where(:puid => puid).first
36
+ raise InvalidPUIDError, "Invalid puid: `#{puid.inspect}`" unless got
37
+ decode(got)
38
+ end
39
+
40
+ def pick(restriction)
41
+ c = sequel_db[table_name].
42
+ where(encode(restriction)).limit(1).first
43
+ c && decode(c)
44
+ end
45
+
46
+ def clear
47
+ sequel_db[table_name].delete
48
+ end
49
+
50
+ def to_relation(restriction = nil)
51
+ tuples = sequel_db[table_name]
52
+ tuples = tuples.where(encode(restriction)) if restriction
53
+ tuples = tuples.map{|t| decode(t, false)}
54
+ Alf::Relation(tuples)
55
+ end
56
+
57
+ private
58
+
59
+ def save_prog(prog)
60
+ sequel_db[table_name].
61
+ where(:puid => prog.puid).
62
+ update(encode(prog))
63
+ prog.puid
64
+ end
65
+
66
+ def register_prog(prog)
67
+ tuple = encode(prog)
68
+ tuple.delete(:puid) if tuple[:puid].nil?
69
+ puid = sequel_db[table_name].insert(tuple)
70
+ if prog.parent.nil? or prog.root.nil?
71
+ sequel_db[table_name].where(:puid => puid).
72
+ update(:root => prog.root || puid, :parent => prog.parent || puid)
73
+ end
74
+ puid
75
+ end
76
+
77
+ def decode(h, as_prog = true)
78
+ h[:pc] = h[:pc].to_sym if h.has_key?(:pc)
79
+ h[:pc] = -1 if h[:pc] == :"-1"
80
+ h[:waitfor] = h[:waitfor].to_sym if h.has_key?(:waitfor)
81
+ h[:waitlist] = ::Kernel.eval(h[:waitlist]) if h.has_key?(:waitlist)
82
+ h[:input] = ::Kernel.eval(h[:input]) if h.has_key?(:input)
83
+ as_prog ? Prog.new(h) : h
84
+ end
85
+
86
+ def encode(prog)
87
+ h = prog.to_hash
88
+ h[:pc] = h[:pc].to_s if h.has_key?(:pc)
89
+ h[:waitfor] = h[:waitfor].to_s if h.has_key?(:waitfor)
90
+ h[:waitlist] = h[:waitlist].inspect if h.has_key?(:waitlist)
91
+ h[:input] = h[:input].inspect if h.has_key?(:input)
92
+ h
93
+ end
94
+
95
+ private
96
+
97
+ def connection_info
98
+ @options[:connection_info] || @options[:uri]
99
+ end
100
+
101
+ def table_name
102
+ @options[:table_name]
103
+ end
104
+
105
+ def ensure_schema(db)
106
+ return if db.table_exists?(tn = table_name)
107
+ db.create_table(tn) do
108
+ primary_key :puid
109
+ Integer :parent
110
+ Integer :root
111
+ String :pc
112
+ String :waitfor
113
+ String :waitlist
114
+ String :input
115
+ index :root
116
+ index :waitfor
117
+ end
118
+ end
119
+
120
+ end # class Sqldb
121
+ end # class ProgList
122
+ end # class VM
123
+ end # module Gisele
@@ -0,0 +1,31 @@
1
+ module Gisele
2
+ class VM
3
+ class ProgList
4
+ class Storage < Component
5
+ attr_reader :options
6
+
7
+ def initialize(options = {})
8
+ super()
9
+ @options = options
10
+ end
11
+
12
+ def save(prog)
13
+ if Array===prog
14
+ prog.map{|p| save(p)}
15
+ else
16
+ prog = is_a_prog!(prog)
17
+ prog.puid ? save_prog(prog) : register_prog(prog)
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def is_a_prog!(prog)
24
+ raise ArgumentError, "Invalid prog: #{prog}", caller unless Prog===prog
25
+ prog
26
+ end
27
+
28
+ end # class Storage
29
+ end # class ProgList
30
+ end # class VM
31
+ end # module Gisele
@@ -0,0 +1,14 @@
1
+ module Gisele
2
+ class VM
3
+ module Proxy
4
+
5
+ def default_options
6
+ { :uri => "druby://localhost:6789" }
7
+ end
8
+ module_function :default_options
9
+
10
+ end # module Proxy
11
+ end # class VM
12
+ end # module Gisele
13
+ require_relative 'proxy/server'
14
+ require_relative 'proxy/client'
@@ -0,0 +1,64 @@
1
+ require 'drb'
2
+ module Gisele
3
+ class VM
4
+ module Proxy
5
+ class Client
6
+ extend Forwardable
7
+
8
+ attr_reader :options
9
+ attr_accessor :logger
10
+ attr_reader :registry
11
+
12
+ def initialize(options = {})
13
+ init_lifecycle
14
+ @options = Proxy.default_options.merge(options)
15
+ @registry = Registry.new(self)
16
+ yield(self) if block_given?
17
+ @logger ||= Logger.new($stdout, Logger::DEBUG)
18
+ end
19
+
20
+ include Robustness
21
+ include Logging
22
+ include Lifecycle
23
+
24
+ def run
25
+ DRb.start_service
26
+ @vm = DRbObject.new nil, options[:uri]
27
+ @vm.to_s
28
+ yield(@vm) if block_given?
29
+ super
30
+ end
31
+
32
+ def stop
33
+ DRb.stop_service
34
+ super
35
+ end
36
+
37
+ def_delegators :registry, :components,
38
+ :register,
39
+ :unregister,
40
+ :connect,
41
+ :disconnect,
42
+ :connected?
43
+ def_delegators :"@vm", :proglist,
44
+ :event_manager
45
+ def_delegators :"@vm", :start,
46
+ :resume,
47
+ :progress
48
+ def_delegators :"@vm", :pick,
49
+ :fetch,
50
+ :save,
51
+ :progs
52
+ def_delegators :"@vm", :event,
53
+ :subscribe,
54
+ :unsubscribe
55
+
56
+ end # Client
57
+ end # module Proxy
58
+
59
+ def self.drb_client(&bl)
60
+ Proxy::Client.new.run(&bl)
61
+ end
62
+
63
+ end # class VM
64
+ end # module Gisele
@@ -0,0 +1,29 @@
1
+ require 'drb'
2
+ module Gisele
3
+ class VM
4
+ module Proxy
5
+ class Server < Component
6
+
7
+ attr_reader :options
8
+
9
+ def initialize(options = {})
10
+ super()
11
+ @options = Proxy.default_options.merge(options)
12
+ end
13
+
14
+ def connect
15
+ super
16
+ DRb.start_service options[:uri], vm
17
+ info "VM proxy started at #{DRb.uri}."
18
+ end
19
+
20
+ def disconnect
21
+ DRb.stop_service
22
+ DRb.thread.join if DRb.thread
23
+ super
24
+ end
25
+
26
+ end # Server
27
+ end # module Proxy
28
+ end # class VM
29
+ end # module Gisele
@@ -0,0 +1,57 @@
1
+ module Gisele
2
+ class VM
3
+ class Registry < Component
4
+
5
+ attr_reader :components
6
+
7
+ def initialize(vm)
8
+ super()
9
+ @vm = vm
10
+ @components = []
11
+ @cconnected = []
12
+ end
13
+
14
+ def register(component, prior = false)
15
+ raise NotImplementedError,
16
+ "Hot registration is not implemented." if connected?
17
+ if prior
18
+ @components.unshift component
19
+ else
20
+ @components.push component
21
+ end
22
+ component.registered(vm)
23
+ end
24
+
25
+ def unregister(component)
26
+ raise NotImplementedError,
27
+ "Hot unregistration is not implemented." if connected?
28
+ @components.delete(component)
29
+ component.unregistered
30
+ end
31
+
32
+ def connect
33
+ super
34
+ @components.each do |c|
35
+ c.connect
36
+ @cconnected << c
37
+ end
38
+ rescue Exception => ex
39
+ fatal error_message(ex, "Unable to connect VM:")
40
+ disconnect
41
+ raise
42
+ end
43
+
44
+ def disconnect
45
+ super
46
+ @cconnected.each do |c|
47
+ begin
48
+ c.disconnect
49
+ rescue Exception => ex
50
+ warn("Error when disconnecting #{c}: #{ex.message}") rescue nil
51
+ end
52
+ end
53
+ end
54
+
55
+ end # class Registry
56
+ end # class VM
57
+ end # module Gisele