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
@@ -0,0 +1,114 @@
1
+ require 'roby/droby/logfile'
2
+
3
+ module Roby
4
+ module DRoby
5
+ module Logfile
6
+ # A class that marshals DRoby cycle events into a log file using
7
+ # Ruby's Marshal facility
8
+ class Writer
9
+ # The current log format version
10
+ FORMAT_VERSION = 5
11
+
12
+ attr_reader :event_io
13
+ attr_reader :buffer_io
14
+
15
+ def initialize(event_io, options = Hash.new)
16
+ @event_io = event_io
17
+ @buffer_io = StringIO.new('', 'w')
18
+
19
+ Logfile.write_header(event_io, options)
20
+ end
21
+
22
+ def self.open(path, options = Hash.new)
23
+ event_io = File.open(path, 'w')
24
+ new(event_io, options)
25
+ end
26
+
27
+ def close
28
+ event_io.close
29
+ end
30
+
31
+ def dump_object(object, io)
32
+ buffer_io.truncate(0)
33
+ buffer_io.seek(0)
34
+ ::Marshal.dump(object, buffer_io)
35
+ io.write([buffer_io.size].pack("L<"))
36
+ io.write(buffer_io.string)
37
+ end
38
+
39
+ def flush
40
+ event_io.flush
41
+ end
42
+
43
+ def dump(cycle)
44
+ dump_object(cycle, event_io)
45
+
46
+ rescue
47
+ self.class.find_invalid_marshalling_object_in_cycle(cycle)
48
+ raise
49
+ end
50
+
51
+ def self.find_invalid_marshalling_object_in_cycle(cycle)
52
+ cycle.each_slice(4) do |m, sec, usec, args|
53
+ begin
54
+ ::Marshal.dump(args)
55
+ rescue Exception => e
56
+ Roby::DRoby::Logfile.fatal "failed to dump message #{m}: #{e}"
57
+ args.each do |obj|
58
+ begin
59
+ ::Marshal.dump(obj)
60
+ rescue Exception => e
61
+ Roby::DRoby::Logfile.fatal "cannot dump #{obj}"
62
+ Roby::DRoby::Logfile.fatal e.to_s
63
+ obj, exception = find_invalid_marshalling_object(obj)
64
+ if obj
65
+ Roby::DRoby::Logfile.fatal " it seems that #{obj} can't be marshalled"
66
+ Roby::DRoby::Logfile.fatal " #{exception.class}: #{exception.message}"
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ def self.find_invalid_marshalling_object(obj, stack = Set.new)
75
+ if stack.include?(obj)
76
+ return
77
+ end
78
+ stack << obj
79
+
80
+ case obj
81
+ when Enumerable
82
+ obj.each do |value|
83
+ invalid, exception = find_invalid_marshalling_object(value, stack)
84
+ if invalid
85
+ return "#{invalid}, []", exception
86
+ end
87
+ end
88
+ end
89
+
90
+ # Generic check for instance variables
91
+ obj.instance_variables.each do |iv|
92
+ value = obj.instance_variable_get(iv)
93
+ invalid, exception = find_invalid_marshalling_object(value, stack)
94
+ if invalid
95
+ return "#{invalid}, #{iv}", exception
96
+ end
97
+ end
98
+
99
+ begin
100
+ ::Marshal.dump(obj)
101
+ nil
102
+ rescue Exception => e
103
+ begin
104
+ return "#{obj} (#{obj.class})", e
105
+ rescue Exception
106
+ return "-- cannot display object, #to_s raised -- (#{obj.class})", e
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
113
+ end
114
+
@@ -0,0 +1,264 @@
1
+ module Roby
2
+ module DRoby
3
+ # Handles marshalling and demarshalling objects for a given peer
4
+ class Marshal
5
+ # The object that allows to match objects known locally with the
6
+ # objects transmitted by the peer
7
+ attr_reader :object_manager
8
+
9
+ # @api private
10
+ #
11
+ # Objects that are temporarily referenced by IDs
12
+ #
13
+ # This is used by {#dump_groups} and {#load_groups}
14
+ attr_reader :context_objects
15
+
16
+ # The ID of the peer that self handles
17
+ #
18
+ # @return [PeerID]
19
+ attr_reader :peer_id
20
+
21
+ # Whether {#local_plan} should just create a plan object if an ID
22
+ # cannot be resolved
23
+ #
24
+ # Use this when the purpose of marshalling/demarshalling is to use
25
+ # Roby objects as information holders, without caring about the
26
+ # plan structure itself
27
+ attr_predicate :auto_create_plans?
28
+
29
+ def initialize(object_manager = ObjectManager.new(nil), peer_id = nil, auto_create_plans: false)
30
+ @object_manager = object_manager
31
+ @peer_id = peer_id
32
+ @context_objects = Hash.new
33
+ @auto_create_plans = auto_create_plans
34
+ end
35
+
36
+
37
+ def with_object(id_to_object)
38
+ current_context = context_objects.dup
39
+ id_to_object.each do |id, object|
40
+ context_objects[id] = object
41
+ context_objects[RemoteDRobyID.new(peer_id, id)] = object
42
+ end
43
+
44
+ yield
45
+
46
+ ensure
47
+ context_objects.replace(current_context)
48
+ end
49
+
50
+ # Temporarily register sets of objects
51
+ #
52
+ # Use this method to marshal sets of objects that could be
53
+ # referencing each other. Using this method ensures that the
54
+ # cross-references are marshalled using IDs instead of full objects
55
+ def dump_groups(*groups)
56
+ current_context = context_objects.dup
57
+ mappings = groups.map do |collection|
58
+ mapping = Array.new
59
+ collection.each do |obj|
60
+ context_objects[obj] = obj.droby_id
61
+ mapping << [obj.droby_id, obj]
62
+ end
63
+ mapping
64
+ end
65
+
66
+ marshalled = mappings.map do |collection|
67
+ collection.flat_map do |obj_id, obj|
68
+ [obj_id, obj.droby_dump(self)]
69
+ end
70
+ end
71
+
72
+ if block_given?
73
+ yield(*marshalled)
74
+ else return *marshalled
75
+ end
76
+
77
+ ensure
78
+ context_objects.replace(current_context)
79
+ end
80
+
81
+ # Load groups marshalled with {#dump_groups}
82
+ def load_groups(*groups)
83
+ current_context = context_objects.dup
84
+
85
+ updates = Array.new
86
+ local_objects = groups.map do |collection|
87
+ collection.each_slice(2).map do |obj_id, marshalled_obj|
88
+ proxy = local_object(marshalled_obj)
89
+ context_objects[obj_id] = proxy
90
+
91
+ if marshalled_obj.respond_to?(:remote_siblings)
92
+ object_manager.register_object(proxy, marshalled_obj.remote_siblings)
93
+ end
94
+ if marshalled_obj.respond_to?(:update)
95
+ updates << [marshalled_obj, proxy]
96
+ end
97
+ proxy
98
+ end
99
+ end
100
+
101
+ updates.each do |marshalled, local|
102
+ marshalled.update(self, local, fresh_proxy: true)
103
+ end
104
+
105
+ if block_given?
106
+ yield(*local_objects)
107
+ else return *local_objects
108
+ end
109
+ ensure
110
+ context_objects.replace(current_context)
111
+ end
112
+
113
+ # Dump an object for transmition to the peer
114
+ def dump(object)
115
+ if droby_id = context_objects[object]
116
+ droby_id
117
+ elsif object.respond_to?(:droby_dump)
118
+ if sibling = object_manager.registered_sibling_on(object, peer_id)
119
+ RemoteDRobyID.new(peer_id, sibling)
120
+ else
121
+ object.droby_dump(self)
122
+ end
123
+ else
124
+ object
125
+ end
126
+ end
127
+
128
+ def dump_model(object)
129
+ marshalled = dump(object)
130
+ if !marshalled.kind_of?(RemoteDRobyID) && object.respond_to?(:droby_dump)
131
+ register_model(object)
132
+ end
133
+ marshalled
134
+ end
135
+
136
+ # Finds a local object that matches the object transmitted by
137
+ # our peer
138
+ #
139
+ # @return [(Boolean,Object)] whether the object was resolved and the
140
+ # unmarshalled object
141
+ def find_local_object(marshalled)
142
+ if local_object = context_objects[marshalled]
143
+ return true, local_object
144
+ elsif marshalled.kind_of?(DRobyID)
145
+ return true, object_manager.fetch_by_id(peer_id, marshalled)
146
+ elsif marshalled.kind_of?(RemoteDRobyID)
147
+ return true, object_manager.fetch_by_id(marshalled.peer_id, marshalled.droby_id)
148
+ elsif marshalled.respond_to?(:remote_siblings)
149
+ marshalled.remote_siblings.each do |peer_id, droby_id|
150
+ if local_object = object_manager.find_by_id(peer_id, droby_id)
151
+ # In case the remote siblings got updated since
152
+ # last time
153
+ object_manager.register_siblings(local_object, marshalled.remote_siblings)
154
+ if marshalled.respond_to?(:update)
155
+ marshalled.update(self, local_object)
156
+ end
157
+ return true, local_object
158
+ end
159
+ end
160
+ return false, nil
161
+ elsif !marshalled.respond_to?(:proxy)
162
+ return true, marshalled
163
+ else
164
+ return false, nil
165
+ end
166
+ end
167
+
168
+ # Resolves a marshalled object into a local object
169
+ #
170
+ # Unlike {#find_local_object}, it raises if the object cannot be
171
+ # resolved
172
+ def local_object(marshalled, create: true)
173
+ resolved, local_object = find_local_object(marshalled)
174
+ if resolved
175
+ local_object
176
+ elsif marshalled.respond_to?(:remote_siblings)
177
+ if !create
178
+ raise NoLocalObject, "#{marshalled} cannot be resolved into a local object and create is false"
179
+ end
180
+
181
+ local_object = marshalled.proxy(self)
182
+ if local_object.respond_to?(:droby_id)
183
+ object_manager.register_object(local_object, marshalled.remote_siblings)
184
+ end
185
+ if marshalled.respond_to?(:update)
186
+ marshalled.update(self, local_object, fresh_proxy: true)
187
+ end
188
+ local_object
189
+ elsif marshalled.respond_to?(:proxy)
190
+ marshalled.proxy(self)
191
+ else
192
+ raise NoLocalObject, "#{marshalled} cannot be resolved into a local object"
193
+ end
194
+ end
195
+
196
+ # Resolve an ID that is known to represent a plan
197
+ #
198
+ # It calls {#local_object} by default, but can be overriden for e.g.
199
+ # environments where rebuilding a plan structure is not important
200
+ # (e.g. the shell)
201
+ def local_plan(marshalled)
202
+ local_object(marshalled)
203
+ rescue UnknownSibling
204
+ Plan.new
205
+ end
206
+
207
+ # Find a known model matching the given name
208
+ #
209
+ # It is first resolved among the
210
+ # models registered with {#register_model} and then resolved in
211
+ # the process constant hierarchy
212
+ def find_local_model(marshalled, name: marshalled.name)
213
+ resolved, local_model = find_local_object(marshalled)
214
+ if resolved
215
+ return local_model
216
+ elsif name && (local_model = object_manager.find_model_by_name(name))
217
+ return local_model
218
+ elsif !name
219
+ return
220
+ end
221
+
222
+ names = name.split('::')
223
+
224
+ # Look locally for the constant listed in the name
225
+ local_object = Object
226
+ while subname = names.shift
227
+ if subname =~ /^[A-Z]\w*$/ && local_object.const_defined_here?(subname)
228
+ local_object = local_object.const_get(subname)
229
+ else return
230
+ end
231
+ end
232
+ return local_object
233
+ end
234
+
235
+ def local_model(marshalled, create: true)
236
+ model = local_object(marshalled, create: create)
237
+ object_manager.register_model(model)
238
+ model
239
+ end
240
+
241
+ # (see ObjectManager#find_model_by_name)
242
+ def find_model_by_name(name)
243
+ object_manager.find_model_by_name(name)
244
+ end
245
+
246
+ # (see ObjectManager#register_object)
247
+ def register_object(object, known_siblings = Hash.new)
248
+ object_manager.register_object(object, known_siblings)
249
+ end
250
+
251
+ # (see ObjectManager#register_model)
252
+ def register_model(local_model, known_siblings = Hash.new, name: local_model.name)
253
+ object_manager.register_model(local_model, known_siblings, name: name)
254
+ end
255
+
256
+ # (see ObjectManager#known_siblings_for)
257
+ def known_siblings_for(object)
258
+ object_manager.known_siblings_for(object)
259
+ end
260
+ end
261
+ end
262
+ end
263
+
264
+
@@ -0,0 +1,12 @@
1
+ class Object
2
+ def droby_marshallable?; true end
3
+ end
4
+
5
+ module Roby
6
+ module DRoby
7
+ module Unmarshallable
8
+ def droby_marshallable?; false end
9
+ end
10
+ end
11
+ end
12
+
@@ -0,0 +1,25 @@
1
+ module Roby
2
+ module DRoby
3
+ class NullEventLogger
4
+ def dump(m, time, *args)
5
+ end
6
+
7
+ def dump_timepoint(m, time, *args)
8
+ end
9
+
10
+ def close
11
+ end
12
+
13
+ def log_queue_size
14
+ 0
15
+ end
16
+
17
+ def dump_time
18
+ 0
19
+ end
20
+
21
+ def flush_cycle(m, *args)
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,205 @@
1
+ module Roby
2
+ module DRoby
3
+ # The object manager manages the IDs of an object among known peers
4
+ class ObjectManager
5
+ # The Peer ID of the local Roby instance
6
+ #
7
+ # @return [PeerID]
8
+ attr_reader :local_id
9
+
10
+ # Resolution of a remote DRobyID by first the object's local ID and
11
+ # then the remote PeerID
12
+ attr_reader :siblings_by_local_object_id
13
+
14
+ # Mapping of known objects by peer and droby ID
15
+ attr_reader :siblings_by_peer
16
+
17
+ # Resolution of models by name
18
+ attr_reader :models_by_name
19
+
20
+ def initialize(local_id)
21
+ @local_id = local_id
22
+ clear
23
+ end
24
+
25
+ def clear
26
+ @siblings_by_peer = Hash.new { |h, k| h[k] = Hash.new }
27
+ @siblings_by_local_object_id = Hash.new { |h, k| h[k] = Hash.new }
28
+ @models_by_name = Hash.new
29
+ end
30
+
31
+ def find_by_id(peer_id, droby_id)
32
+ if object_siblings = siblings_by_peer.fetch(peer_id, nil)
33
+ object_siblings[droby_id]
34
+ end
35
+ end
36
+
37
+ def fetch_by_id(peer_id, droby_id)
38
+ if local_object = find_by_id(peer_id, droby_id)
39
+ local_object
40
+ else
41
+ raise UnknownSibling, "there is no known object for #{droby_id}@#{peer_id.inspect} on #{self}"
42
+ end
43
+ end
44
+
45
+ # The registered ID for this object on a given peer
46
+ #
47
+ # @param [#droby_id] local_object
48
+ # @param [PeerID] peer_id the ID of our peer
49
+ # @return [DRobyID,nil]
50
+ def registered_sibling_on(local_object, peer_id)
51
+ if local_object.respond_to?(:droby_id)
52
+ if siblings = siblings_by_local_object_id.fetch(local_object.droby_id, nil)
53
+ siblings[peer_id]
54
+ end
55
+ end
56
+ end
57
+
58
+ # The ID this object is known for on the given peer
59
+ #
60
+ # @param [#droby_id] local_object
61
+ # @param [PeerID] peer_id the ID of our peer
62
+ # @return [DRobyID,nil]
63
+ def known_sibling_on(local_object, peer_id)
64
+ if local_object.respond_to?(:droby_id)
65
+ if siblings = siblings_by_local_object_id.fetch(local_object.droby_id, nil)
66
+ siblings[peer_id]
67
+ elsif peer_id == local_id
68
+ local_object.droby_id
69
+ end
70
+ end
71
+ end
72
+
73
+ # The set of IDs known for this object
74
+ #
75
+ # This returns a mapping from peer IDs to the ID of the provided
76
+ # object on this peer. The list of siblings is maintained by
77
+ # {#register_object} and {#deregister_object}
78
+ #
79
+ # @param [Object] object
80
+ # @return [Hash] the siblings. A hash that announces the local ID is
81
+ # returned if the object is not registered, and an empty hash if
82
+ # it is not DRoby-addressable
83
+ def known_siblings_for(object)
84
+ if object.respond_to?(:droby_id)
85
+ if siblings = siblings_by_local_object_id.fetch(object.droby_id, nil)
86
+ siblings
87
+ else Hash[local_id => object.droby_id]
88
+ end
89
+ else Hash.new
90
+ end
91
+ end
92
+
93
+ # Tests whether self knows about a local object
94
+ def include?(local_object)
95
+ siblings_by_local_object_id.has_key?(local_object.droby_id)
96
+ end
97
+
98
+ # Registers siblings for a local object
99
+ #
100
+ # Unlike {#register_object}, it does not automatically adds the
101
+ # local mapping to the set of known siblings
102
+ def register_siblings(local_object, siblings)
103
+ local_object_id = local_object.droby_id
104
+ siblings.each do |peer_id, droby_id|
105
+ siblings_by_peer[peer_id][droby_id] = local_object
106
+ end
107
+ siblings_by_local_object_id[local_object_id].
108
+ merge!(siblings)
109
+ end
110
+
111
+ # Deregisters siblings of a known local object
112
+ #
113
+ # If the object has no known siblings left, it is also
114
+ # deregistered
115
+ def deregister_siblings(local_object, siblings)
116
+ local_object_id = local_object.droby_id
117
+ object_siblings = siblings_by_local_object_id[local_object_id]
118
+
119
+ siblings.each do |peer_id, droby_id|
120
+ if actual_droby_id = object_siblings.delete(peer_id)
121
+ if actual_droby_id != droby_id
122
+ raise ArgumentError, "DRobyID of #{local_object} on #{peer_id} mismatches between provided #{droby_id} and registered #{actual_droby_id}"
123
+ end
124
+ siblings_by_peer[peer_id].delete(droby_id)
125
+ end
126
+ end
127
+ if object_siblings.empty?
128
+ deregister_object(local_object)
129
+ end
130
+ end
131
+
132
+ # Registers the mappings from object IDs to the corresponding local object
133
+ #
134
+ # This registers the mapping for the local process (local_id =>
135
+ # local_object.droby_id), along with known siblings if provided
136
+ def register_object(local_object, known_siblings = Hash.new)
137
+ register_siblings(local_object, local_id => local_object.droby_id)
138
+ register_siblings(local_object, known_siblings)
139
+ end
140
+
141
+ # Deregisters a mapping from object IDs to a particular object
142
+ def deregister_object(local_object)
143
+ siblings = siblings_by_local_object_id.delete(local_object.droby_id)
144
+ siblings.each do |peer_id, droby_id|
145
+ siblings_by_peer[peer_id].delete(droby_id)
146
+ end
147
+
148
+ if local_object.respond_to?(:name)
149
+ if local_object == models_by_name[n = local_object.name]
150
+ models_by_name.delete(n)
151
+ end
152
+ end
153
+ end
154
+
155
+ # Register a model by name and a list of known siblings for it
156
+ #
157
+ # In addition to ID-based resolution, models can also be resolved by
158
+ # name through {#find_model_by_name}. This registers the name
159
+ # mapping and then calls {#register_object}
160
+ def register_model(local_object, known_siblings = Hash.new, name: local_object.name)
161
+ if name
162
+ models_by_name[name] = local_object
163
+ end
164
+ register_object(local_object, known_siblings)
165
+ end
166
+
167
+ # Attempts to resolve a registered model by its name
168
+ #
169
+ # In addition to ID-based resolution, models registered with
170
+ # {#register_model} can also be resolved by name.
171
+ #
172
+ # This attempts a name-based resolution
173
+ #
174
+ # @param [String] name the name of the model to resolve
175
+ # @return [Object,nil]
176
+ def find_model_by_name(name)
177
+ models_by_name[name]
178
+ end
179
+
180
+ def pretty_print(pp)
181
+ pp.text "Object manager with local ID=#{local_id}"
182
+ pp.nest(2) do
183
+ pp.breakable
184
+ pp.text "Registered objects"
185
+ siblings_by_peer.each do |peer_id, siblings|
186
+ siblings.each do |peer_object_id, object|
187
+ pp.breakable
188
+ pp.text " #{peer_object_id}@#{peer_id} "
189
+ pp.nest(4) do
190
+ object.pretty_print(pp)
191
+ end
192
+ end
193
+ end
194
+ end
195
+ end
196
+
197
+ def stat
198
+ Hash[siblings_by_local_object_id: siblings_by_local_object_id.size,
199
+ models_by_name: models_by_name.size,
200
+ siblings_by_peer: siblings_by_peer.inject(0) { |sum, (_, siblings)| sum += siblings.size }]
201
+ end
202
+ end
203
+ end
204
+ end
205
+