roby 0.8.0 → 3.0.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 (644) hide show
  1. checksums.yaml +7 -0
  2. data/.deep-cover.rb +3 -0
  3. data/.gitattributes +1 -0
  4. data/.gitignore +24 -0
  5. data/.simplecov +10 -0
  6. data/.travis.yml +17 -0
  7. data/.yardopts +4 -0
  8. data/Gemfile +15 -0
  9. data/README.md +11 -0
  10. data/Rakefile +47 -177
  11. data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
  12. data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
  13. data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
  14. data/benchmark/{genom.rb → attic/genom.rb} +0 -0
  15. data/benchmark/attic/transactions.rb +62 -0
  16. data/benchmark/plan_basic_operations.rb +28 -0
  17. data/benchmark/relations/graph.rb +63 -0
  18. data/benchmark/ruby/identity.rb +18 -0
  19. data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
  20. data/benchmark/ruby/yield_vs_block.rb +35 -0
  21. data/benchmark/run +5 -0
  22. data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
  23. data/benchmark/transactions.rb +99 -51
  24. data/bin/roby +38 -197
  25. data/bin/roby-display +14 -0
  26. data/bin/roby-log +3 -176
  27. data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
  28. data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
  29. data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
  30. data/doc/guide/{src → attic}/abstraction/index.page +1 -1
  31. data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
  32. data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
  33. data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
  34. data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
  35. data/doc/guide/attic/cycle/error_handling.page +98 -0
  36. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
  37. data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
  38. data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
  39. data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
  40. data/doc/guide/{src → attic}/cycle/index.page +1 -1
  41. data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
  42. data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
  43. data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
  44. data/doc/guide/attic/plans/building_plans.page +89 -0
  45. data/doc/guide/attic/plans/code.page +192 -0
  46. data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
  47. data/doc/guide/attic/plans/index.page +7 -0
  48. data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
  49. data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
  50. data/doc/guide/attic/plans/querying_plans.page +5 -0
  51. data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
  52. data/doc/guide/config.yaml +7 -4
  53. data/doc/guide/ext/extended_menu.rb +29 -0
  54. data/doc/guide/ext/init.rb +6 -0
  55. data/doc/guide/ext/rdoc_links.rb +7 -6
  56. data/doc/guide/src/advanced_concepts/history.page +5 -0
  57. data/doc/guide/src/advanced_concepts/index.page +11 -0
  58. data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
  59. data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
  60. data/doc/guide/src/advanced_concepts/transactions.page +5 -0
  61. data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
  62. data/doc/guide/src/base.template +96 -0
  63. data/doc/guide/src/basics_shell_header.txt +5 -7
  64. data/doc/guide/src/building/action_coordination.page +96 -0
  65. data/doc/guide/src/building/actions.page +124 -0
  66. data/doc/guide/src/building/file_layout.page +71 -0
  67. data/doc/guide/src/building/index.page +50 -0
  68. data/doc/guide/src/building/patterns.page +86 -0
  69. data/doc/guide/src/building/patterns_forwarding.png +0 -0
  70. data/doc/guide/src/building/patterns_forwarding.svg +277 -0
  71. data/doc/guide/src/building/runtime.page +95 -0
  72. data/doc/guide/src/building/task_models.page +94 -0
  73. data/doc/guide/src/building/tasks.page +284 -0
  74. data/doc/guide/src/concepts/error_handling.page +100 -0
  75. data/doc/guide/src/concepts/exception_propagation.png +0 -0
  76. data/doc/guide/src/concepts/exception_propagation.svg +445 -0
  77. data/doc/guide/src/concepts/execution.page +85 -0
  78. data/doc/guide/src/concepts/execution.png +0 -0
  79. data/doc/guide/src/concepts/execution.svg +573 -0
  80. data/doc/guide/src/concepts/execution_cycle.png +0 -0
  81. data/doc/guide/src/concepts/garbage_collection.page +57 -0
  82. data/doc/guide/src/concepts/index.page +27 -0
  83. data/doc/guide/src/concepts/plans.page +101 -0
  84. data/doc/guide/src/concepts/policy.page +31 -0
  85. data/doc/guide/src/concepts/reactor.page +61 -0
  86. data/doc/guide/src/concepts/simple_plan_example.png +0 -0
  87. data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
  88. data/doc/guide/src/default.template +9 -74
  89. data/doc/guide/src/event_relations/forward.page +71 -0
  90. data/doc/guide/src/event_relations/index.page +12 -0
  91. data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
  92. data/doc/guide/src/event_relations/signal.page +55 -0
  93. data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
  94. data/doc/guide/src/htmldoc.metainfo +21 -8
  95. data/doc/guide/src/index.page +8 -3
  96. data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
  97. data/doc/guide/src/installation/publications.page +14 -0
  98. data/doc/guide/src/{introduction → installation}/videos.page +14 -7
  99. data/doc/guide/src/interacting/index.page +16 -0
  100. data/doc/guide/src/interacting/run.page +33 -0
  101. data/doc/guide/src/interacting/shell.page +95 -0
  102. data/doc/guide/src/plugins/creating_plugins.page +72 -0
  103. data/doc/guide/src/plugins/index.page +27 -5
  104. data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
  105. data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
  106. data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
  107. data/doc/guide/src/style_screen.css +687 -0
  108. data/doc/guide/src/task_relations/dependency.page +107 -0
  109. data/doc/guide/src/task_relations/executed_by.page +77 -0
  110. data/doc/guide/src/task_relations/index.page +12 -0
  111. data/doc/guide/src/task_relations/new_relations.page +119 -0
  112. data/doc/guide/src/task_relations/planned_by.page +46 -0
  113. data/doc/guide/src/tutorial/app.page +117 -0
  114. data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
  115. data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
  116. data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
  117. data/doc/guide/src/tutorial/events.page +195 -0
  118. data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
  119. data/doc/guide/src/tutorial/index.page +13 -0
  120. data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
  121. data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
  122. data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
  123. data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
  124. data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
  125. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
  126. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
  127. data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
  128. data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
  129. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
  130. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
  131. data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
  132. data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
  133. data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
  134. data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
  135. data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
  136. data/doc/guide/src/tutorial/relations_display.page +153 -0
  137. data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
  138. data/doc/guide/src/tutorial/shell.page +121 -0
  139. data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
  140. data/doc/guide/src/tutorial/tasks.page +374 -0
  141. data/lib/roby.rb +102 -47
  142. data/lib/roby/actions.rb +17 -0
  143. data/lib/roby/actions/action.rb +80 -0
  144. data/lib/roby/actions/interface.rb +45 -0
  145. data/lib/roby/actions/library.rb +23 -0
  146. data/lib/roby/actions/models/action.rb +224 -0
  147. data/lib/roby/actions/models/coordination_action.rb +58 -0
  148. data/lib/roby/actions/models/interface.rb +22 -0
  149. data/lib/roby/actions/models/interface_base.rb +294 -0
  150. data/lib/roby/actions/models/library.rb +12 -0
  151. data/lib/roby/actions/models/method_action.rb +90 -0
  152. data/lib/roby/actions/task.rb +114 -0
  153. data/lib/roby/and_generator.rb +125 -0
  154. data/lib/roby/app.rb +2795 -829
  155. data/lib/roby/app/autotest_console_reporter.rb +138 -0
  156. data/lib/roby/app/base.rb +21 -0
  157. data/lib/roby/app/cucumber.rb +2 -0
  158. data/lib/roby/app/cucumber/controller.rb +439 -0
  159. data/lib/roby/app/cucumber/helpers.rb +280 -0
  160. data/lib/roby/app/cucumber/world.rb +32 -0
  161. data/lib/roby/app/debug.rb +136 -0
  162. data/lib/roby/app/gen.rb +2 -0
  163. data/lib/roby/app/rake.rb +178 -38
  164. data/lib/roby/app/robot_config.rb +9 -0
  165. data/lib/roby/app/robot_names.rb +115 -0
  166. data/lib/roby/app/run.rb +3 -2
  167. data/lib/roby/app/scripts.rb +72 -0
  168. data/lib/roby/app/scripts/autotest.rb +173 -0
  169. data/lib/roby/app/scripts/display.rb +2 -0
  170. data/lib/roby/app/scripts/restart.rb +52 -0
  171. data/lib/roby/app/scripts/results.rb +17 -8
  172. data/lib/roby/app/scripts/run.rb +155 -24
  173. data/lib/roby/app/scripts/shell.rb +147 -62
  174. data/lib/roby/app/scripts/test.rb +107 -22
  175. data/lib/roby/app/test_reporter.rb +74 -0
  176. data/lib/roby/app/test_server.rb +159 -0
  177. data/lib/roby/app/vagrant.rb +47 -0
  178. data/lib/roby/backports.rb +16 -0
  179. data/lib/roby/cli/display.rb +190 -0
  180. data/lib/roby/cli/exceptions.rb +17 -0
  181. data/lib/roby/cli/gen/actions/class.rb +5 -0
  182. data/lib/roby/cli/gen/actions/test.rb +6 -0
  183. data/lib/roby/cli/gen/app/.yardopts +6 -0
  184. data/lib/roby/cli/gen/app/README.md +28 -0
  185. data/lib/roby/cli/gen/app/Rakefile +15 -0
  186. data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
  187. data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
  188. data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
  189. data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
  190. data/lib/roby/cli/gen/class/class.rb +6 -0
  191. data/lib/roby/cli/gen/class/test.rb +7 -0
  192. data/lib/roby/cli/gen/helpers.rb +203 -0
  193. data/lib/roby/cli/gen/module/module.rb +5 -0
  194. data/lib/roby/cli/gen/module/test.rb +6 -0
  195. data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
  196. data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
  197. data/lib/roby/cli/gen/task/class.rb +44 -0
  198. data/lib/roby/cli/gen/task/test.rb +6 -0
  199. data/lib/roby/cli/gen_main.rb +120 -0
  200. data/lib/roby/cli/log.rb +276 -0
  201. data/lib/roby/cli/log/flamegraph.html +499 -0
  202. data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
  203. data/lib/roby/cli/main.rb +153 -0
  204. data/lib/roby/coordination.rb +60 -0
  205. data/lib/roby/coordination/action_script.rb +25 -0
  206. data/lib/roby/coordination/action_state_machine.rb +125 -0
  207. data/lib/roby/coordination/actions.rb +106 -0
  208. data/lib/roby/coordination/base.rb +145 -0
  209. data/lib/roby/coordination/calculus.rb +40 -0
  210. data/lib/roby/coordination/child.rb +28 -0
  211. data/lib/roby/coordination/event.rb +29 -0
  212. data/lib/roby/coordination/fault_handler.rb +25 -0
  213. data/lib/roby/coordination/fault_handling_task.rb +13 -0
  214. data/lib/roby/coordination/fault_response_table.rb +110 -0
  215. data/lib/roby/coordination/models/action_script.rb +64 -0
  216. data/lib/roby/coordination/models/action_state_machine.rb +224 -0
  217. data/lib/roby/coordination/models/actions.rb +191 -0
  218. data/lib/roby/coordination/models/arguments.rb +55 -0
  219. data/lib/roby/coordination/models/base.rb +176 -0
  220. data/lib/roby/coordination/models/capture.rb +86 -0
  221. data/lib/roby/coordination/models/child.rb +35 -0
  222. data/lib/roby/coordination/models/event.rb +41 -0
  223. data/lib/roby/coordination/models/exceptions.rb +42 -0
  224. data/lib/roby/coordination/models/fault_handler.rb +219 -0
  225. data/lib/roby/coordination/models/fault_response_table.rb +77 -0
  226. data/lib/roby/coordination/models/root.rb +22 -0
  227. data/lib/roby/coordination/models/script.rb +283 -0
  228. data/lib/roby/coordination/models/task.rb +184 -0
  229. data/lib/roby/coordination/models/task_from_action.rb +50 -0
  230. data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
  231. data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
  232. data/lib/roby/coordination/models/task_from_variable.rb +27 -0
  233. data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
  234. data/lib/roby/coordination/models/variable.rb +32 -0
  235. data/lib/roby/coordination/script.rb +200 -0
  236. data/lib/roby/coordination/script_instruction.rb +12 -0
  237. data/lib/roby/coordination/task.rb +45 -0
  238. data/lib/roby/coordination/task_base.rb +69 -0
  239. data/lib/roby/coordination/task_script.rb +293 -0
  240. data/lib/roby/coordination/task_state_machine.rb +308 -0
  241. data/lib/roby/decision_control.rb +33 -21
  242. data/lib/roby/distributed_object.rb +76 -0
  243. data/lib/roby/droby.rb +17 -0
  244. data/lib/roby/droby/droby_id.rb +6 -0
  245. data/lib/roby/droby/enable.rb +153 -0
  246. data/lib/roby/droby/event_logger.rb +189 -0
  247. data/lib/roby/droby/event_logging.rb +57 -0
  248. data/lib/roby/droby/exceptions.rb +14 -0
  249. data/lib/roby/droby/identifiable.rb +22 -0
  250. data/lib/roby/droby/logfile.rb +141 -0
  251. data/lib/roby/droby/logfile/client.rb +176 -0
  252. data/lib/roby/droby/logfile/file_format.md +97 -0
  253. data/lib/roby/droby/logfile/index.rb +117 -0
  254. data/lib/roby/droby/logfile/reader.rb +139 -0
  255. data/lib/roby/droby/logfile/server.rb +199 -0
  256. data/lib/roby/droby/logfile/writer.rb +114 -0
  257. data/lib/roby/droby/marshal.rb +264 -0
  258. data/lib/roby/droby/marshallable.rb +12 -0
  259. data/lib/roby/droby/null_event_logger.rb +25 -0
  260. data/lib/roby/droby/object_manager.rb +205 -0
  261. data/lib/roby/droby/peer_id.rb +6 -0
  262. data/lib/roby/droby/plan_rebuilder.rb +373 -0
  263. data/lib/roby/droby/rebuilt_plan.rb +160 -0
  264. data/lib/roby/droby/remote_droby_id.rb +6 -0
  265. data/lib/roby/droby/timepoints.rb +205 -0
  266. data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
  267. data/lib/roby/droby/timepoints_ctf.rb +125 -0
  268. data/lib/roby/droby/v5.rb +14 -0
  269. data/lib/roby/droby/v5/builtin.rb +120 -0
  270. data/lib/roby/droby/v5/droby_class.rb +45 -0
  271. data/lib/roby/droby/v5/droby_constant.rb +81 -0
  272. data/lib/roby/droby/v5/droby_dump.rb +1026 -0
  273. data/lib/roby/droby/v5/droby_id.rb +44 -0
  274. data/lib/roby/droby/v5/droby_model.rb +82 -0
  275. data/lib/roby/droby/v5/peer_id.rb +10 -0
  276. data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
  277. data/lib/roby/event.rb +79 -957
  278. data/lib/roby/event_constraints.rb +835 -0
  279. data/lib/roby/event_generator.rb +1047 -0
  280. data/lib/roby/event_structure/causal_link.rb +6 -0
  281. data/lib/roby/event_structure/forwarding.rb +6 -0
  282. data/lib/roby/event_structure/precedence.rb +7 -0
  283. data/lib/roby/event_structure/signal.rb +8 -0
  284. data/lib/roby/event_structure/temporal_constraints.rb +640 -0
  285. data/lib/roby/exceptions.rb +446 -152
  286. data/lib/roby/executable_plan.rb +549 -0
  287. data/lib/roby/execution_engine.rb +1997 -950
  288. data/lib/roby/filter_generator.rb +26 -0
  289. data/lib/roby/gui/chronicle_view.rb +225 -0
  290. data/lib/roby/gui/chronicle_widget.rb +925 -0
  291. data/lib/roby/gui/dot_id.rb +11 -0
  292. data/lib/roby/gui/exception_view.rb +44 -0
  293. data/lib/roby/gui/log_display.rb +273 -0
  294. data/lib/roby/gui/model_views.rb +2 -0
  295. data/lib/roby/gui/model_views/action_interface.rb +53 -0
  296. data/lib/roby/gui/model_views/task.rb +47 -0
  297. data/lib/roby/gui/model_views/task.rhtml +41 -0
  298. data/lib/roby/gui/object_info_view.rb +89 -0
  299. data/lib/roby/gui/plan_dot_layout.rb +427 -0
  300. data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
  301. data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
  302. data/lib/roby/gui/relations_view.rb +278 -0
  303. data/lib/roby/gui/relations_view/relations.ui +139 -0
  304. data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
  305. data/lib/roby/gui/relations_view/relations_config.rb +292 -0
  306. data/lib/roby/gui/relations_view/relations_view.ui +53 -0
  307. data/lib/roby/gui/scheduler_view.css +24 -0
  308. data/lib/roby/gui/scheduler_view.rb +46 -0
  309. data/lib/roby/gui/scheduler_view.rhtml +53 -0
  310. data/lib/roby/gui/stepping.rb +93 -0
  311. data/lib/roby/gui/stepping.ui +181 -0
  312. data/lib/roby/gui/styles.rb +81 -0
  313. data/lib/roby/gui/task_display_configuration.rb +42 -0
  314. data/lib/roby/gui/task_state_at.rb +38 -0
  315. data/lib/roby/hooks.rb +26 -0
  316. data/lib/roby/interface.rb +136 -469
  317. data/lib/roby/interface/async.rb +20 -0
  318. data/lib/roby/interface/async/action_monitor.rb +188 -0
  319. data/lib/roby/interface/async/interface.rb +498 -0
  320. data/lib/roby/interface/async/job_monitor.rb +213 -0
  321. data/lib/roby/interface/async/log.rb +238 -0
  322. data/lib/roby/interface/async/new_job_listener.rb +79 -0
  323. data/lib/roby/interface/async/ui_connector.rb +183 -0
  324. data/lib/roby/interface/client.rb +553 -0
  325. data/lib/roby/interface/command.rb +24 -0
  326. data/lib/roby/interface/command_argument.rb +16 -0
  327. data/lib/roby/interface/command_library.rb +92 -0
  328. data/lib/roby/interface/droby_channel.rb +174 -0
  329. data/lib/roby/interface/exceptions.rb +22 -0
  330. data/lib/roby/interface/interface.rb +655 -0
  331. data/lib/roby/interface/job.rb +47 -0
  332. data/lib/roby/interface/rest.rb +10 -0
  333. data/lib/roby/interface/rest/api.rb +29 -0
  334. data/lib/roby/interface/rest/helpers.rb +24 -0
  335. data/lib/roby/interface/rest/server.rb +212 -0
  336. data/lib/roby/interface/server.rb +154 -0
  337. data/lib/roby/interface/shell_client.rb +468 -0
  338. data/lib/roby/interface/shell_subcommand.rb +24 -0
  339. data/lib/roby/interface/subcommand_client.rb +35 -0
  340. data/lib/roby/interface/tcp.rb +168 -0
  341. data/lib/roby/models/arguments.rb +112 -0
  342. data/lib/roby/models/plan_object.rb +83 -0
  343. data/lib/roby/models/task.rb +835 -0
  344. data/lib/roby/models/task_event.rb +62 -0
  345. data/lib/roby/models/task_service.rb +78 -0
  346. data/lib/roby/or_generator.rb +88 -0
  347. data/lib/roby/plan.rb +1751 -864
  348. data/lib/roby/plan_object.rb +611 -0
  349. data/lib/roby/plan_service.rb +200 -0
  350. data/lib/roby/promise.rb +332 -0
  351. data/lib/roby/queries.rb +23 -0
  352. data/lib/roby/queries/and_matcher.rb +32 -0
  353. data/lib/roby/queries/any.rb +27 -0
  354. data/lib/roby/queries/code_error_matcher.rb +58 -0
  355. data/lib/roby/queries/event_generator_matcher.rb +9 -0
  356. data/lib/roby/queries/execution_exception_matcher.rb +165 -0
  357. data/lib/roby/queries/index.rb +165 -0
  358. data/lib/roby/queries/localized_error_matcher.rb +149 -0
  359. data/lib/roby/queries/matcher_base.rb +107 -0
  360. data/lib/roby/queries/none.rb +27 -0
  361. data/lib/roby/queries/not_matcher.rb +30 -0
  362. data/lib/roby/queries/op_matcher.rb +8 -0
  363. data/lib/roby/queries/or_matcher.rb +30 -0
  364. data/lib/roby/queries/plan_object_matcher.rb +363 -0
  365. data/lib/roby/queries/query.rb +188 -0
  366. data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
  367. data/lib/roby/queries/task_matcher.rb +344 -0
  368. data/lib/roby/relations.rb +42 -678
  369. data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
  370. data/lib/roby/relations/directed_relation_support.rb +268 -0
  371. data/lib/roby/relations/event_relation_graph.rb +19 -0
  372. data/lib/roby/relations/fork_merge_visitor.rb +154 -0
  373. data/lib/roby/relations/graph.rb +533 -0
  374. data/lib/roby/relations/models/directed_relation_support.rb +11 -0
  375. data/lib/roby/relations/models/graph.rb +75 -0
  376. data/lib/roby/relations/models/task_relation_graph.rb +18 -0
  377. data/lib/roby/relations/space.rb +380 -0
  378. data/lib/roby/relations/task_relation_graph.rb +20 -0
  379. data/lib/roby/robot.rb +85 -38
  380. data/lib/roby/schedulers/basic.rb +155 -25
  381. data/lib/roby/schedulers/null.rb +20 -0
  382. data/lib/roby/schedulers/reporting.rb +31 -0
  383. data/lib/roby/schedulers/state.rb +129 -0
  384. data/lib/roby/schedulers/temporal.rb +91 -0
  385. data/lib/roby/singletons.rb +87 -0
  386. data/lib/roby/standalone.rb +4 -2
  387. data/lib/roby/standard_errors.rb +405 -82
  388. data/lib/roby/state.rb +6 -3
  389. data/lib/roby/state/conf_model.rb +5 -0
  390. data/lib/roby/state/events.rb +181 -95
  391. data/lib/roby/state/goal_model.rb +77 -0
  392. data/lib/roby/state/open_struct.rb +591 -0
  393. data/lib/roby/state/open_struct_model.rb +68 -0
  394. data/lib/roby/state/pos.rb +45 -45
  395. data/lib/roby/state/shapes.rb +11 -11
  396. data/lib/roby/state/state_model.rb +303 -0
  397. data/lib/roby/state/task.rb +43 -0
  398. data/lib/roby/support.rb +88 -148
  399. data/lib/roby/task.rb +1361 -1750
  400. data/lib/roby/task_arguments.rb +428 -0
  401. data/lib/roby/task_event.rb +127 -0
  402. data/lib/roby/task_event_generator.rb +337 -0
  403. data/lib/roby/task_service.rb +6 -0
  404. data/lib/roby/task_structure/conflicts.rb +104 -0
  405. data/lib/roby/task_structure/dependency.rb +932 -0
  406. data/lib/roby/task_structure/error_handling.rb +118 -0
  407. data/lib/roby/task_structure/executed_by.rb +234 -0
  408. data/lib/roby/task_structure/planned_by.rb +90 -0
  409. data/lib/roby/tasks/aggregator.rb +37 -0
  410. data/lib/roby/tasks/external_process.rb +275 -0
  411. data/lib/roby/tasks/group.rb +27 -0
  412. data/lib/roby/tasks/null.rb +19 -0
  413. data/lib/roby/tasks/parallel.rb +43 -0
  414. data/lib/roby/tasks/sequence.rb +88 -0
  415. data/lib/roby/tasks/simple.rb +21 -0
  416. data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
  417. data/lib/roby/tasks/timeout.rb +17 -0
  418. data/lib/roby/tasks/virtual.rb +55 -0
  419. data/lib/roby/template_plan.rb +7 -0
  420. data/lib/roby/test/aruba_minitest.rb +74 -0
  421. data/lib/roby/test/assertion.rb +16 -0
  422. data/lib/roby/test/assertions.rb +490 -0
  423. data/lib/roby/test/common.rb +368 -591
  424. data/lib/roby/test/dsl.rb +149 -0
  425. data/lib/roby/test/error.rb +18 -0
  426. data/lib/roby/test/event_reporter.rb +83 -0
  427. data/lib/roby/test/execution_expectations.rb +1134 -0
  428. data/lib/roby/test/expect_execution.rb +151 -0
  429. data/lib/roby/test/minitest_helpers.rb +166 -0
  430. data/lib/roby/test/roby_app_helpers.rb +200 -0
  431. data/lib/roby/test/run_planners.rb +155 -0
  432. data/lib/roby/test/self.rb +112 -0
  433. data/lib/roby/test/spec.rb +198 -0
  434. data/lib/roby/test/tasks/empty_task.rb +4 -4
  435. data/lib/roby/test/tasks/goto.rb +28 -27
  436. data/lib/roby/test/teardown_plans.rb +100 -0
  437. data/lib/roby/test/testcase.rb +239 -307
  438. data/lib/roby/test/tools.rb +159 -155
  439. data/lib/roby/test/validate_state_machine.rb +75 -0
  440. data/lib/roby/transaction.rb +1125 -0
  441. data/lib/roby/transaction/event_generator_proxy.rb +63 -0
  442. data/lib/roby/transaction/plan_object_proxy.rb +99 -0
  443. data/lib/roby/transaction/plan_service_proxy.rb +43 -0
  444. data/lib/roby/transaction/proxying.rb +120 -0
  445. data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
  446. data/lib/roby/transaction/task_proxy.rb +135 -0
  447. data/lib/roby/until_generator.rb +30 -0
  448. data/lib/roby/version.rb +5 -0
  449. data/lib/roby/yard.rb +169 -0
  450. data/lib/yard-roby.rb +1 -0
  451. data/manifest.xml +32 -6
  452. data/roby.gemspec +59 -0
  453. metadata +788 -587
  454. data/Manifest.txt +0 -321
  455. data/NOTES +0 -4
  456. data/README.txt +0 -166
  457. data/TODO.txt +0 -146
  458. data/app/README.txt +0 -24
  459. data/app/Rakefile +0 -8
  460. data/app/config/ROBOT.rb +0 -5
  461. data/app/config/init.rb +0 -33
  462. data/app/config/roby.yml +0 -3
  463. data/app/controllers/ROBOT.rb +0 -2
  464. data/app/planners/ROBOT/main.rb +0 -6
  465. data/app/planners/main.rb +0 -5
  466. data/app/scripts/distributed +0 -3
  467. data/app/scripts/generate/bookmarks +0 -3
  468. data/app/scripts/replay +0 -3
  469. data/app/scripts/results +0 -3
  470. data/app/scripts/run +0 -3
  471. data/app/scripts/server +0 -3
  472. data/app/scripts/shell +0 -3
  473. data/app/scripts/test +0 -3
  474. data/app/tasks/.gitattributes +0 -0
  475. data/app/tasks/ROBOT/.gitattributes +0 -0
  476. data/bin/roby-shell +0 -25
  477. data/doc/guide/src/basics/app.page +0 -139
  478. data/doc/guide/src/basics/index.page +0 -11
  479. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  480. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  481. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  482. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  483. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  484. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  485. data/doc/guide/src/basics/relations_display.page +0 -203
  486. data/doc/guide/src/basics/shell.page +0 -102
  487. data/doc/guide/src/default.css +0 -319
  488. data/doc/guide/src/introduction/index.page +0 -29
  489. data/doc/guide/src/introduction/publications.page +0 -14
  490. data/doc/guide/src/relations/dependency.page +0 -89
  491. data/doc/guide/src/relations/index.page +0 -12
  492. data/ext/droby/dump.cc +0 -175
  493. data/ext/droby/extconf.rb +0 -3
  494. data/ext/graph/algorithm.cc +0 -746
  495. data/ext/graph/extconf.rb +0 -7
  496. data/ext/graph/graph.cc +0 -575
  497. data/ext/graph/graph.hh +0 -183
  498. data/ext/graph/iterator_sequence.hh +0 -102
  499. data/ext/graph/undirected_dfs.hh +0 -226
  500. data/ext/graph/undirected_graph.hh +0 -421
  501. data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
  502. data/lib/roby/app/scripts/replay.rb +0 -31
  503. data/lib/roby/app/scripts/server.rb +0 -18
  504. data/lib/roby/basic_object.rb +0 -151
  505. data/lib/roby/config.rb +0 -14
  506. data/lib/roby/distributed.rb +0 -36
  507. data/lib/roby/distributed/base.rb +0 -448
  508. data/lib/roby/distributed/communication.rb +0 -875
  509. data/lib/roby/distributed/connection_space.rb +0 -616
  510. data/lib/roby/distributed/distributed_object.rb +0 -206
  511. data/lib/roby/distributed/drb.rb +0 -62
  512. data/lib/roby/distributed/notifications.rb +0 -531
  513. data/lib/roby/distributed/peer.rb +0 -555
  514. data/lib/roby/distributed/protocol.rb +0 -529
  515. data/lib/roby/distributed/proxy.rb +0 -343
  516. data/lib/roby/distributed/subscription.rb +0 -311
  517. data/lib/roby/distributed/transaction.rb +0 -498
  518. data/lib/roby/external_process_task.rb +0 -225
  519. data/lib/roby/graph.rb +0 -160
  520. data/lib/roby/log.rb +0 -3
  521. data/lib/roby/log/chronicle.rb +0 -303
  522. data/lib/roby/log/console.rb +0 -74
  523. data/lib/roby/log/data_stream.rb +0 -275
  524. data/lib/roby/log/dot.rb +0 -279
  525. data/lib/roby/log/event_stream.rb +0 -161
  526. data/lib/roby/log/file.rb +0 -396
  527. data/lib/roby/log/gui/basic_display.ui +0 -83
  528. data/lib/roby/log/gui/basic_display_ui.rb +0 -89
  529. data/lib/roby/log/gui/chronicle.rb +0 -26
  530. data/lib/roby/log/gui/chronicle_view.rb +0 -40
  531. data/lib/roby/log/gui/chronicle_view.ui +0 -70
  532. data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
  533. data/lib/roby/log/gui/data_displays.rb +0 -171
  534. data/lib/roby/log/gui/data_displays.ui +0 -155
  535. data/lib/roby/log/gui/data_displays_ui.rb +0 -146
  536. data/lib/roby/log/gui/notifications.rb +0 -26
  537. data/lib/roby/log/gui/relations.rb +0 -269
  538. data/lib/roby/log/gui/relations.ui +0 -123
  539. data/lib/roby/log/gui/relations_ui.rb +0 -120
  540. data/lib/roby/log/gui/relations_view.rb +0 -185
  541. data/lib/roby/log/gui/relations_view.ui +0 -149
  542. data/lib/roby/log/gui/relations_view_ui.rb +0 -144
  543. data/lib/roby/log/gui/replay.rb +0 -366
  544. data/lib/roby/log/gui/replay_controls.rb +0 -206
  545. data/lib/roby/log/gui/replay_controls.ui +0 -282
  546. data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
  547. data/lib/roby/log/gui/runtime.rb +0 -130
  548. data/lib/roby/log/hooks.rb +0 -186
  549. data/lib/roby/log/logger.rb +0 -203
  550. data/lib/roby/log/notifications.rb +0 -244
  551. data/lib/roby/log/plan_rebuilder.rb +0 -468
  552. data/lib/roby/log/relations.rb +0 -1084
  553. data/lib/roby/log/server.rb +0 -547
  554. data/lib/roby/log/sqlite.rb +0 -47
  555. data/lib/roby/log/timings.rb +0 -233
  556. data/lib/roby/plan-object.rb +0 -371
  557. data/lib/roby/planning.rb +0 -13
  558. data/lib/roby/planning/loops.rb +0 -309
  559. data/lib/roby/planning/model.rb +0 -1012
  560. data/lib/roby/planning/task.rb +0 -180
  561. data/lib/roby/query.rb +0 -655
  562. data/lib/roby/relations/conflicts.rb +0 -67
  563. data/lib/roby/relations/dependency.rb +0 -358
  564. data/lib/roby/relations/ensured.rb +0 -19
  565. data/lib/roby/relations/error_handling.rb +0 -22
  566. data/lib/roby/relations/events.rb +0 -7
  567. data/lib/roby/relations/executed_by.rb +0 -208
  568. data/lib/roby/relations/influence.rb +0 -10
  569. data/lib/roby/relations/planned_by.rb +0 -63
  570. data/lib/roby/state/information.rb +0 -55
  571. data/lib/roby/state/state.rb +0 -367
  572. data/lib/roby/task-operations.rb +0 -186
  573. data/lib/roby/task_index.rb +0 -80
  574. data/lib/roby/test/distributed.rb +0 -230
  575. data/lib/roby/test/tasks/simple_task.rb +0 -23
  576. data/lib/roby/transactions.rb +0 -507
  577. data/lib/roby/transactions/proxy.rb +0 -325
  578. data/plugins/fault_injection/History.txt +0 -4
  579. data/plugins/fault_injection/README.txt +0 -34
  580. data/plugins/fault_injection/Rakefile +0 -12
  581. data/plugins/fault_injection/TODO.txt +0 -0
  582. data/plugins/fault_injection/app.rb +0 -52
  583. data/plugins/fault_injection/fault_injection.rb +0 -89
  584. data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
  585. data/plugins/subsystems/README.txt +0 -37
  586. data/plugins/subsystems/Rakefile +0 -13
  587. data/plugins/subsystems/app.rb +0 -182
  588. data/plugins/subsystems/test/app/README +0 -24
  589. data/plugins/subsystems/test/app/Rakefile +0 -8
  590. data/plugins/subsystems/test/app/config/app.yml +0 -71
  591. data/plugins/subsystems/test/app/config/init.rb +0 -12
  592. data/plugins/subsystems/test/app/config/roby.yml +0 -3
  593. data/plugins/subsystems/test/app/planners/main.rb +0 -20
  594. data/plugins/subsystems/test/app/scripts/distributed +0 -3
  595. data/plugins/subsystems/test/app/scripts/replay +0 -3
  596. data/plugins/subsystems/test/app/scripts/results +0 -3
  597. data/plugins/subsystems/test/app/scripts/run +0 -3
  598. data/plugins/subsystems/test/app/scripts/server +0 -3
  599. data/plugins/subsystems/test/app/scripts/shell +0 -3
  600. data/plugins/subsystems/test/app/scripts/test +0 -3
  601. data/plugins/subsystems/test/app/tasks/services.rb +0 -15
  602. data/plugins/subsystems/test/test_subsystems.rb +0 -78
  603. data/test/distributed/test_communication.rb +0 -195
  604. data/test/distributed/test_connection.rb +0 -284
  605. data/test/distributed/test_execution.rb +0 -378
  606. data/test/distributed/test_mixed_plan.rb +0 -341
  607. data/test/distributed/test_plan_notifications.rb +0 -238
  608. data/test/distributed/test_protocol.rb +0 -525
  609. data/test/distributed/test_query.rb +0 -106
  610. data/test/distributed/test_remote_plan.rb +0 -491
  611. data/test/distributed/test_transaction.rb +0 -466
  612. data/test/mockups/external_process +0 -28
  613. data/test/mockups/tasks.rb +0 -27
  614. data/test/planning/test_loops.rb +0 -432
  615. data/test/planning/test_model.rb +0 -427
  616. data/test/planning/test_task.rb +0 -126
  617. data/test/relations/test_conflicts.rb +0 -42
  618. data/test/relations/test_dependency.rb +0 -324
  619. data/test/relations/test_ensured.rb +0 -38
  620. data/test/relations/test_executed_by.rb +0 -224
  621. data/test/relations/test_planned_by.rb +0 -56
  622. data/test/suite_core.rb +0 -29
  623. data/test/suite_distributed.rb +0 -10
  624. data/test/suite_planning.rb +0 -4
  625. data/test/suite_relations.rb +0 -8
  626. data/test/tasks/test_external_process.rb +0 -126
  627. data/test/tasks/test_thread_task.rb +0 -70
  628. data/test/test_bgl.rb +0 -528
  629. data/test/test_event.rb +0 -969
  630. data/test/test_exceptions.rb +0 -591
  631. data/test/test_execution_engine.rb +0 -987
  632. data/test/test_gui.rb +0 -20
  633. data/test/test_interface.rb +0 -43
  634. data/test/test_log.rb +0 -125
  635. data/test/test_log_server.rb +0 -133
  636. data/test/test_plan.rb +0 -418
  637. data/test/test_query.rb +0 -424
  638. data/test/test_relations.rb +0 -260
  639. data/test/test_state.rb +0 -432
  640. data/test/test_support.rb +0 -16
  641. data/test/test_task.rb +0 -1181
  642. data/test/test_testcase.rb +0 -138
  643. data/test/test_transactions.rb +0 -610
  644. data/test/test_transactions_proxy.rb +0 -216
@@ -1,206 +0,0 @@
1
- module Roby
2
- module Distributed
3
- # Module included in objects distributed across multiple pDBs
4
- module DistributedObject
5
- attribute(:mutex) { Mutex.new }
6
- attribute(:synchro_call) { ConditionVariable.new }
7
-
8
- # Makes this object owned by the local DB. This is equivalent to
9
- # object.self_owned = true
10
- def self_owned; self.self_owned = true end
11
-
12
- # Adds or removes the local DB from the list of owners. This is
13
- # equivalent to calling add_peer(Distributed) and
14
- # remove_peer(Distributed)
15
- def self_owned=(flag)
16
- if flag then add_owner(Distributed)
17
- else remove_owner(Distributed)
18
- end
19
- end
20
-
21
- # Add the Peer +peer+ to the list of owners
22
- def add_owner(peer, distributed = true)
23
- return if owners.include?(peer)
24
- if distributed
25
- if !self_owned?
26
- raise OwnershipError, "not object owner"
27
- end
28
-
29
- call_siblings(:add_owner, self, peer)
30
- added_owner(peer)
31
- else
32
- owners << peer
33
- if plan
34
- plan.task_index.add_owner(self, peer)
35
- end
36
- Distributed.debug { "added owner to #{self}: #{owners.to_a}" }
37
- end
38
- end
39
- def added_owner(peer); super if defined? super end
40
-
41
- # Removes +peer+ from the list of owners. Raises OwnershipError if
42
- # there are modified tasks in this transaction which are owned by
43
- # +peer+
44
- def remove_owner(peer, distributed = true)
45
- return unless owners.include?(peer)
46
-
47
- if distributed
48
- results = call_siblings(:prepare_remove_owner, self, peer)
49
- if error = results.values.find { |error| error }
50
- raise error
51
- end
52
- call_siblings(:remove_owner, self, peer)
53
- else
54
- owners.delete(peer)
55
- removed_owner(peer)
56
- if plan
57
- plan.task_index.remove_owner(self, peer)
58
- end
59
- Distributed.debug { "removed owner to #{self}: #{owners.to_a}" }
60
- end
61
- nil
62
- end
63
- def prepare_remove_owner(peer); super if defined? super end
64
- def removed_owner(peer); super if defined? super end
65
-
66
- def owner=(peer)
67
- add_owner(peer)
68
- owners.each do |owner|
69
- remove_owner(owner) unless owner == peer
70
- end
71
- end
72
-
73
-
74
- def call_siblings(m, *args)
75
- Distributed.call_peers(updated_peers.dup << Distributed, m, *args)
76
- end
77
-
78
- def call_owners(*args) # :nodoc:
79
- raise OwnershipError, "not owner" if !self_owned?
80
-
81
- if owners.any? { |peer| !has_sibling_on?(peer) }
82
- raise InvalidRemoteOperation, "cannot do #{args} if the object is not distributed on all its owners"
83
- end
84
-
85
- Distributed.call_peers(owners, *args)
86
- end
87
- end
88
-
89
- # Calls +args+ on all peers and returns a { peer => return_value } hash
90
- # of all the values returned by each peer
91
- def self.call_peers(calling, m, *args)
92
- Distributed.debug { "distributed call of #{m}(#{args}) on #{calling}" }
93
-
94
- # This is a tricky procedure. Let's describe what is done here:
95
- # * we send the required message to the peers listed in +calling+,
96
- # and wait for all of them to have finished
97
- # * since there is a coordination requirement, once a peer have
98
- # processed its call we stop processing any of the messages it
99
- # sends. We therefore block the RX thread of this peer using
100
- # the block_communication condition variable
101
-
102
- result = Hash.new
103
- call_local = calling.include?(Distributed)
104
- synchro, mutex = Roby.condition_variable(true)
105
-
106
- mutex.synchronize do
107
- waiting_for = calling.size
108
- waiting_for -= 1 if call_local
109
-
110
- calling.each do |peer|
111
- next if peer == Distributed
112
-
113
- callback = Proc.new do |peer_result|
114
- mutex.synchronize do
115
- result[peer] = peer.local_object(peer_result)
116
- waiting_for -= 1
117
- Distributed.debug { "reply for #{m}(#{args.join(", ")}) from #{peer}, #{waiting_for} remaining" }
118
- if waiting_for == 0
119
- synchro.broadcast
120
- end
121
- peer.disable_rx
122
- end
123
- end
124
- peer.queue_call false, m, args, callback, Thread.current
125
- end
126
-
127
- unless waiting_for == 0
128
- Distributed.debug "waiting for our peers to complete the call"
129
- synchro.wait(mutex)
130
- end
131
- end
132
-
133
- if call_local
134
- Distributed.debug "processing locally ..."
135
- result[Distributed] = Distributed.call(m, *args)
136
- end
137
- result
138
-
139
- ensure
140
- for peer in calling
141
- peer.enable_rx if peer != Distributed
142
- end
143
- Roby.return_condition_variable(synchro, mutex)
144
- end
145
-
146
- class PeerServer
147
- # Message sent when our remote peer requests that we create a local
148
- # representation for one of its objects. It therefore creates a
149
- # sibling for +marshalled_object+, which is a representation of a
150
- # distributed object present on our peer.
151
- #
152
- # It calls #created_sibling on +marshalled_object+ with the new
153
- # created sibling, to allow for specific operations to be done on
154
- # it.
155
- def create_sibling(marshalled_object)
156
- object_remote_id = peer.remote_object(marshalled_object)
157
- if sibling = peer.proxies[object_remote_id]
158
- raise ArgumentError, "#{marshalled_object} has already a sibling (#{sibling})"
159
- end
160
-
161
- sibling = marshalled_object.sibling(peer)
162
- peer.subscriptions << object_remote_id
163
- marshalled_object.created_sibling(peer, sibling)
164
- nil
165
- end
166
-
167
- # Message received when +owner+ is a peer which now owns +object+
168
- def add_owner(object, owner)
169
- peer.local_object(object).add_owner(peer.local_object(owner), false)
170
- nil
171
- end
172
- # Message received when +owner+ does not own +object+ anymore
173
- def remove_owner(object, owner)
174
- peer.local_object(object).remove_owner(peer.local_object(owner), false)
175
- nil
176
- end
177
- # Message received before #remove_owner, to verify if the removal
178
- # operation can be done or not.
179
- def prepare_remove_owner(object, owner)
180
- peer.local_object(object).prepare_remove_owner(peer.local_object(owner))
181
- nil
182
- rescue
183
- $!
184
- end
185
- end
186
-
187
- class Peer
188
- # Creates a sibling for +object+ on the peer, and returns the corresponding
189
- # DRbObject
190
- def create_sibling(object)
191
- unless object.kind_of?(DistributedObject)
192
- raise TypeError, "cannot create a sibling for a non-distributed object"
193
- end
194
-
195
- call(:create_sibling, object)
196
- subscriptions << object.sibling_on(self)
197
- Roby.synchronize do
198
- local_server.subscribe(object)
199
- end
200
-
201
- synchro_point
202
- end
203
- end
204
- end
205
- end
206
-
@@ -1,62 +0,0 @@
1
- require 'rinda/rinda'
2
- require 'rinda/ring'
3
-
4
- require 'roby/distributed/protocol'
5
-
6
- # This file contains extension to dRuby and Rinda classes which are needed to
7
- # make Distributed Roby work
8
- #
9
- # Some are direct modification of the standard library (through reopening classes),
10
- # others are made by subclassing the standard library.
11
-
12
- module Rinda
13
- class NotifyTemplateEntry
14
- def pop(nonblock = false)
15
- raise RequestExpiredError if @done
16
- it = @queue.pop(nonblock) rescue nil
17
- @done = true if it && it[0] == 'close'
18
- return it
19
- end
20
- end
21
- end
22
-
23
- module Roby::Distributed
24
- # Reimplements Rinda::RingServer, removing the tuplespace intermediate and
25
- # the creation of most threads. This is done for performance reasons.
26
- class RingServer < Rinda::RingServer
27
- attr_reader :bind, :port
28
-
29
- # Added a :bind option
30
- def initialize(ts, options = {})
31
- options = validate_options options, :bind => Socket.gethostname, :port => Rinda::Ring_PORT
32
-
33
- @bind = options[:bind]
34
- @port = options[:port]
35
-
36
- @ts = ts
37
- @soc = UDPSocket.new
38
- @soc.bind options[:bind], options[:port]
39
- @service = service
40
- end
41
-
42
- def service
43
- Thread.new do
44
- Thread.current.priority = 0
45
- begin
46
- loop do
47
- msg = @soc.recv(1024)
48
- tuple, timeout = Marshal.load(msg)
49
- tuple[1].call(@ts) rescue nil
50
- end
51
- rescue Interrupt
52
- end
53
- end
54
- end
55
-
56
- def close
57
- @service.raise Interrupt, "interrupting RingServer"
58
- @soc.close
59
- end
60
- end
61
- end
62
-
@@ -1,531 +0,0 @@
1
- module Roby
2
- module Distributed
3
- # Returns the set of edges for which both sides are in +objects+. The
4
- # set if formatted as [object, relations, ...] where +relations+ is the
5
- # output of relations_of
6
- def self.subgraph_of(objects)
7
- return [] if objects.size < 2
8
-
9
- relations = []
10
-
11
- objects = objects.dup
12
- objects.delete_if do |obj|
13
- obj_relations = relations_of(obj) do |related_object|
14
- objects.include?(related_object)
15
- end
16
- relations << obj << obj_relations
17
- true
18
- end
19
-
20
- relations
21
- end
22
-
23
- # call-seq:
24
- # relations_of(object) => relations
25
- # relations_of(object) { |object| ... } => relations
26
- #
27
- # Relations to be sent to the remote host if +object+ is in a plan. The
28
- # returned array if formatted as
29
- # [ [graph, parents, children], [graph, ..] ]
30
- # where +parents+ is the set of parents of +objects+ in +graph+ and
31
- # +children+ the set of children
32
- #
33
- # +parents+ and +children+ are formatted as
34
- # [object, info, object, info, ...]
35
- #
36
- # If a block is given, a new parent or child is added only if the block
37
- # returns true
38
- def self.relations_of(object)
39
- result = []
40
- # For transaction proxies, never send non-discovered relations to
41
- # remote hosts
42
- Roby::Distributed.each_object_relation(object) do |graph|
43
- next unless graph.distribute?
44
- parents = []
45
- object.each_parent_object(graph) do |parent|
46
- next unless parent.distribute?
47
- next unless yield(parent) if block_given?
48
- parents << parent << parent[object, graph]
49
- end
50
- children = []
51
- object.each_child_object(graph) do |child|
52
- next unless child.distribute?
53
- next unless yield(child) if block_given?
54
- children << child << object[child, graph]
55
- end
56
- result << graph << parents << children
57
- end
58
-
59
- result
60
- end
61
-
62
- # Set of hooks which send Plan updates to remote hosts
63
- module PlanModificationHooks
64
- # Hook called when a new task is marked as mission. It sends a
65
- # PeerServer#plan_set_mission message to the remote host.
66
- #
67
- # Note that plan will have called the #added_tasks hook
68
- # beforehand
69
- def added_mission(task)
70
- super if defined? super
71
- return unless task.distribute? && task.self_owned?
72
-
73
- unless Distributed.updating?(self) || Distributed.updating?(task)
74
- Distributed.each_updated_peer(self, task) do |peer|
75
- peer.transmit(:plan_set_mission, self, task, true)
76
- end
77
- Distributed.trigger(task)
78
- end
79
- end
80
-
81
- # Hook called when a new task is not a mission anymore. It sends a
82
- # PeerServer#plan_set_mission message to the remote host.
83
- def unmarked_mission(task)
84
- super if defined? super
85
- return unless task.distribute? && task.self_owned?
86
-
87
- unless Distributed.updating?(self) || Distributed.updating?(task)
88
- Distributed.each_updated_peer(self, task) do |peer|
89
- peer.transmit(:plan_set_mission, self, task, false)
90
- end
91
- end
92
- end
93
-
94
- # Common implementation for the #added_events and
95
- # #added_tasks hooks. It sends PeerServer#plan_add for
96
- # all tasks which can be shared among plan managers
97
- def self.added_objects(plan, objects)
98
- unless Distributed.updating?(plan)
99
- relations = nil
100
- Distributed.each_updated_peer(plan) do |peer|
101
- # Compute +objects+ and +relations+ only if there is a
102
- # peer to update
103
- unless relations
104
- objects = objects.find_all { |t| t.distribute? && t.self_owned? && t.root_object? && !Distributed.updating?(t) }
105
- return if objects.empty?
106
- relations = Distributed.subgraph_of(objects)
107
- end
108
- peer.transmit(:plan_add, plan, objects, relations)
109
- end
110
- Distributed.trigger(*objects)
111
- end
112
- end
113
- # New tasks have been added in the plan.
114
- #
115
- # See PlanModificationHooks.added_objects
116
- def added_tasks(tasks)
117
- super if defined? super
118
- PlanModificationHooks.added_objects(self, tasks)
119
- end
120
- # New free events have been added in the plan.
121
- #
122
- # See PlanModificationHooks.added_objects
123
- def added_events(events)
124
- super if defined? super
125
- PlanModificationHooks.added_objects(self, events)
126
- end
127
-
128
- # Hook called when +from+ has been replaced by +to+ in the plan.
129
- # It sends a PeerServer#plan_replace message
130
- def replaced(from, to)
131
- super if defined? super
132
- if (from.distribute? && to.distribute?) && (to.self_owned? || from.self_owned?)
133
- unless Distributed.updating?(self) || Distributed.updating_all?([from, to])
134
- Distributed.each_updated_peer(from) do |peer|
135
- peer.transmit(:plan_replace, self, from, to)
136
- end
137
- end
138
- end
139
- end
140
-
141
- # Common implementation for the #finalized_task and
142
- # PeerServer#finalized_event hooks. It sends the plan_remove_object message.
143
- def self.finalized_object(plan, object)
144
- return unless object.distribute? && object.root_object?
145
-
146
- Distributed.keep.delete(object)
147
-
148
- if object.self_owned?
149
- Distributed.clean_triggered(object)
150
-
151
- if !Distributed.updating?(plan)
152
- Distributed.peers.each_value do |peer|
153
- if peer.connected?
154
- peer.transmit(:plan_remove_object, plan, object)
155
- end
156
- end
157
- end
158
-
159
- if object.remotely_useful?
160
- Distributed.removed_objects << object
161
- end
162
- else
163
- object.remote_siblings.keys.each do |peer|
164
- object.forget_peer(peer) unless peer == Roby::Distributed
165
- end
166
- end
167
- end
168
- # Hook called when a task has been removed from the plan.
169
- #
170
- # See PlanModificationHooks.finalized_object
171
- def finalized_task(task)
172
- super if defined? super
173
- PlanModificationHooks.finalized_object(self, task)
174
- end
175
- # Hook called when a free event has been removed from the plan.
176
- #
177
- # See PlanModificationHooks.finalized_object
178
- def finalized_event(event)
179
- super if defined? super
180
- PlanModificationHooks.finalized_object(self, event)
181
- end
182
- end
183
- Plan.include PlanModificationHooks
184
-
185
- class PeerServer
186
- # Message received when +task+ has become a mission (flag = true),
187
- # or has become a non-mission (flag = false) in +plan+.
188
- def plan_set_mission(plan, task, flag)
189
- plan = peer.local_object(plan)
190
- task = peer.local_object(task)
191
- if plan.owns?(task)
192
- if flag
193
- plan.add_mission(task)
194
- else
195
- plan.remove_mission(task)
196
- end
197
- else
198
- task.mission = flag
199
- end
200
- nil
201
- end
202
-
203
- # Message received when the set of tasks +m_tasks+ has been
204
- # added by the remote plan. +m_relations+ describes the
205
- # internal relations between elements of +m_tasks+. It is in a
206
- # format suitable for PeerServer#set_relations.
207
- def plan_add(plan, m_tasks, m_relations)
208
- Distributed.update(plan = peer.local_object(plan)) do
209
- tasks = peer.local_object(m_tasks).to_value_set
210
- Distributed.update_all(tasks) do
211
- plan.add(tasks)
212
- m_relations.each_slice(2) do |obj, rel|
213
- set_relations(obj, rel)
214
- end
215
- end
216
- end
217
- nil
218
- end
219
-
220
- # Message received when +m_from+ has been replaced by +m_to+ in the
221
- # plan
222
- def plan_replace(plan, m_from, m_to)
223
- Distributed.update(plan = peer.local_object(plan)) do
224
- from, to = peer.local_object(m_from), peer.local_object(m_to)
225
-
226
- Distributed.update_all([from, to]) { plan.replace(from, to) }
227
-
228
- # Subscribe to the new task if the old task was subscribed
229
- # +from+ will be unsubscribed when it is finalized
230
- if peer.subscribed?(from) && !peer.subscribed?(to)
231
- peer.subscribe(to)
232
- nil
233
- end
234
- end
235
- nil
236
- end
237
-
238
- # Message received when +object+ has been removed from +plan+
239
- def plan_remove_object(plan, object)
240
- if local = peer.local_object(object, false)
241
- # Beware, transaction proxies have no 'plan' attribute
242
- plan = peer.local_object(plan)
243
- Distributed.update(plan) do
244
- Distributed.update(local) do
245
- plan.remove_object(local)
246
- end
247
- end
248
- local.forget_peer(peer)
249
- end
250
-
251
- rescue ArgumentError => e
252
- if e.message =~ /has not been included in this plan/
253
- Roby::Distributed.warn "filtering the 'not included in this plan bug'"
254
- else
255
- raise
256
- end
257
- end
258
-
259
- # Message received when a relation graph has been updated. +op+ is
260
- # either +add_child_object+ or +remove_child_object+ and describes
261
- # what relation modification should be done. The two plan objects
262
- # +m_from+ and +m_to+ are respectively linked or unlinked in the
263
- # relation +m_rel+, with the given information object in case of a
264
- # new relation.
265
- def update_relation(plan, m_from, op, m_to, m_rel, m_info = nil)
266
- if plan
267
- Roby::Distributed.update(peer.local_object(plan)) { update_relation(nil, m_from, op, m_to, m_rel, m_info) }
268
- else
269
- from, to =
270
- peer.local_object(m_from, false),
271
- peer.local_object(m_to, false)
272
-
273
- if !from
274
- return unless to && (to.self_owned? || to.subscribed?)
275
- from = peer.local_object(m_from)
276
- elsif !to
277
- return unless from && (from.self_owned? || from.subscribed?)
278
- to = peer.local_object(m_to)
279
- end
280
-
281
- rel = peer.local_object(m_rel)
282
- Roby::Distributed.update_all([from.root_object, to.root_object]) do
283
- if op == :add_child_object
284
- from.add_child_object(to, rel, peer.local_object(m_info))
285
- elsif op == :remove_child_object
286
- from.remove_child_object(to, rel)
287
- end
288
- end
289
- end
290
- nil
291
- end
292
- end
293
-
294
- # This module defines the hooks needed to notify our peers of relation
295
- # modifications. It is included in plan objects.
296
- module RelationModificationHooks
297
- # Hook called when a new relation is added. It sends the
298
- # PeerServer#update_relation message.
299
- def added_child_object(child, relations, info)
300
- super if defined? super
301
-
302
- return if Distributed.updating?(plan)
303
- return if Distributed.updating_all?([self.root_object, child.root_object])
304
- return unless Distributed.state
305
-
306
- # Remove all relations that should not be distributed, and if
307
- # there is a relation remaining, notify our peer only of the
308
- # first one: this is the child of all others
309
- if notified_relation = relations.find { |rel| rel.distribute? }
310
- Distributed.each_updated_peer(self.root_object, child.root_object) do |peer|
311
- peer.transmit(:update_relation, plan, self, :add_child_object, child, notified_relation, info)
312
- end
313
- Distributed.trigger(self, child)
314
- end
315
- end
316
-
317
- # Hook called when a relation is removed. It sends the
318
- # PeerServer#update_relation message.
319
- def removed_child_object(child, relations)
320
- super if defined? super
321
- return unless Distributed.state
322
-
323
- # If our peer is pushing a distributed transaction, children
324
- # can be removed Avoid sending unneeded updates by testing on
325
- # plan update
326
- return if Distributed.updating?(plan)
327
- return if Distributed.updating_all?([self.root_object, child.root_object])
328
-
329
- # Remove all relations that should not be distributed, and if
330
- # there is a relation remaining, notify our peer only of the
331
- # first one: this is the child of all others
332
- if notified_relation = relations.find { |rel| rel.distribute? }
333
- Distributed.each_updated_peer(self.root_object, child.root_object) do |peer|
334
- peer.transmit(:update_relation, plan, self, :remove_child_object, child, notified_relation)
335
- end
336
- Distributed.trigger(self, child)
337
- end
338
- end
339
- end
340
- PlanObject.include RelationModificationHooks
341
-
342
- # This module includes the hooks needed to notify our peers of event
343
- # propagation (fired, forwarding and signalling)
344
- module EventNotifications
345
- # Hook called when an event has been emitted. It sends the
346
- # PeerServer#event_fired message.
347
- def fired(event)
348
- super if defined? super
349
- if self_owned? && !Distributed.updating?(root_object)
350
- Distributed.each_updated_peer(root_object) do |peer|
351
- peer.transmit(:event_fired, self, event.object_id, event.time, event.context)
352
- end
353
- end
354
- end
355
- # Hook called when an event is being forwarded. It sends the
356
- # PeerServer#event_add_propagation message.
357
- def forwarding(event, to)
358
- super if defined? super
359
- if self_owned? && !Distributed.updating?(root_object)
360
- Distributed.each_updated_peer(root_object, to.root_object) do |peer|
361
- peer.transmit(:event_add_propagation, true, self, to, event.object_id, event.time, event.context)
362
- end
363
- end
364
- end
365
- # Hook called when an event is being forwarded. It sends the
366
- # PeerServer#event_add_propagation message.
367
- def signalling(event, to)
368
- super if defined? super
369
- if self_owned? && !Distributed.updating?(root_object)
370
- Distributed.each_updated_peer(root_object, to.root_object) do |peer|
371
- peer.transmit(:event_add_propagation, false, self, to, event.object_id, event.time, event.context)
372
- end
373
- end
374
- end
375
-
376
- # This module define hooks on Roby::Plan to manage the event fired
377
- # cache. It is required by the receiving side of the event
378
- # propagation distribution.
379
- #
380
- # See PeerServer#pending_events
381
- module PlanCacheCleanup
382
- # Removes events generated by +generator+ from the Event object
383
- # cache, PeerServer#pending_events. This cache is used by
384
- # PeerServer#event_for on behalf of PeerServer#event_fired and
385
- # PeerServer#event_add_propagation
386
- def finalized_event(generator)
387
- super if defined? super
388
- Distributed.peers.each_value do |peer|
389
- peer.local_server.pending_events.delete(generator)
390
- end
391
- end
392
- end
393
- Roby::Plan.include PlanCacheCleanup
394
- end
395
- Roby::EventGenerator.include EventNotifications
396
-
397
- class PeerServer
398
- # A set of events which have been received by #event_fired. This
399
- # cache in cleaned up by PlanCacheCleanup#finalized_event when the
400
- # associated generator is finalized.
401
- #
402
- # This cache is used to merge the events between the firing step
403
- # (event_fired) and the propagation steps (add_event_propagation).
404
- # Without it, different Event objects at the various method calls.
405
- attribute(:pending_events) { Hash.new }
406
-
407
- # Creates an Event object for +generator+, with the given argument
408
- # as parameters, or returns an already existing one
409
- def event_for(generator, event_id, time, context)
410
- id, event = pending_events[generator]
411
- if id && id == event_id
412
- return event
413
- end
414
-
415
- event = generator.new(context)
416
- event.send(:time=, time)
417
- if generator.respond_to?(:task)
418
- generator.task.update_task_status(event)
419
- end
420
- pending_events[generator] = [event_id, event]
421
- event
422
- end
423
-
424
- # Message received when the +marshalled_from+ generator fired an
425
- # event, with the given event id, time and context.
426
- def event_fired(marshalled_from, event_id, time, context)
427
- from_generator = peer.local_object(marshalled_from)
428
- context = peer.local_object(context)
429
-
430
- event = event_for(from_generator, event_id, time, context)
431
-
432
- event.send(:propagation_id=, from_generator.plan.engine.propagation_id)
433
- from_generator.instance_variable_set("@happened", true)
434
- from_generator.fired(event)
435
- from_generator.call_handlers(event)
436
-
437
- nil
438
- end
439
-
440
- # Message received when the +marshalled_from+ generator has either
441
- # been forwarded (only_forward = true) or signals (only_forward =
442
- # false) the +marshalled_to+ generator. The remaining information
443
- # describes the event itself.
444
- def event_add_propagation(only_forward, marshalled_from, marshalled_to, event_id, time, context)
445
- from_generator = peer.local_object(marshalled_from)
446
- to_generator = peer.local_object(marshalled_to)
447
- context = peer.local_object(context)
448
-
449
- event = event_for(from_generator, event_id, time, context)
450
-
451
- # Only add the signalling if we own +to+
452
- if to_generator.self_owned?
453
- to_generator.plan.engine.add_event_propagation(only_forward, [event], to_generator, event.context, nil)
454
- else
455
- # Call #signalling or #forwarding to make
456
- # +from_generator+ look like as if the event was really
457
- # fired locally ...
458
- Distributed.update_all([from_generator.root_object, to_generator.root_object]) do
459
- if only_forward then from_generator.forwarding(event, to_generator)
460
- else from_generator.signalling(event, to_generator)
461
- end
462
- end
463
- end
464
-
465
- nil
466
- end
467
- end
468
-
469
- # This module defines the hooks required by dRoby on Roby::Task
470
- module TaskNotifications
471
- # Hook called when the internal task data is modified. It sends
472
- # PeerServer#updated_data
473
- def updated_data
474
- super if defined? super
475
-
476
- unless Distributed.updating?(self)
477
- Distributed.each_updated_peer(self) do |peer|
478
- peer.transmit(:updated_data, self, data)
479
- end
480
- end
481
- end
482
- end
483
- Roby::Task.include TaskNotifications
484
-
485
- # This module defines the hooks required by dRoby on Roby::TaskArguments
486
- module TaskArgumentsNotifications
487
- # Hook called when the task argumensts are modified. It sends
488
- # the PeerServer#updated_arguments message.
489
- def updated
490
- super if defined? super
491
-
492
- unless Distributed.updating?(task)
493
- Distributed.each_updated_peer(task) do |peer|
494
- peer.transmit(:updated_arguments, task, task.arguments)
495
- end
496
- end
497
- end
498
- end
499
- TaskArguments.include TaskArgumentsNotifications
500
-
501
- class PeerServer
502
- # Message received to announce that the internal data of +task+ is
503
- # now +data+.
504
- def updated_data(task, data)
505
- proxy = peer.local_object(task)
506
- proxy.instance_variable_set("@data", peer.proxy(data))
507
- nil
508
- end
509
-
510
- # Message received to announce that the arguments of +task+ have
511
- # been modified. +arguments+ is a hash containing only the new
512
- # values.
513
- def updated_arguments(task, arguments)
514
- proxy = peer.local_object(task)
515
- arguments = peer.proxy(arguments)
516
- Distributed.update(proxy) do
517
- proxy.arguments.merge!(arguments || {})
518
- end
519
- nil
520
- end
521
- end
522
-
523
- class PeerServer
524
- # Message received to update our view of the remote robot state.
525
- def state_update(new_state)
526
- peer.state = new_state
527
- nil
528
- end
529
- end
530
- end
531
- end