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,555 +0,0 @@
1
- require 'set'
2
- require 'utilrb/array/to_s'
3
- require 'utilrb/socket/tcp_socket'
4
-
5
- require 'roby'
6
- require 'roby/state'
7
- require 'roby/planning'
8
- require 'roby/distributed/notifications'
9
- require 'roby/distributed/proxy'
10
- require 'roby/distributed/communication'
11
-
12
- module Roby
13
- class ExecutionEngine; include DRbUndumped end
14
- end
15
-
16
- module Roby::Distributed
17
- class ConnectionSpace
18
- def add_owner(object, peer)
19
- object.add_owner(peer, false)
20
- end
21
- def remove_owner(object, peer)
22
- object.remove_owner(peer, false)
23
- end
24
- def prepare_remove_owner(object, peer)
25
- object.prepare_remove_owner(peer)
26
- rescue Exception => e
27
- e
28
- end
29
- end
30
-
31
- class ConnectionTask < Roby::Task
32
- local_only
33
-
34
- argument :peer
35
- def peer; arguments[:peer] end
36
-
37
- event :ready
38
- def ready?; event(:ready).happened? end
39
-
40
- event :aborted, :terminal => true do |context|
41
- peer.disconnected!
42
- end
43
- forward :aborted => :failed
44
-
45
- event :failed, :terminal => true do |context|
46
- peer.disconnect
47
- end
48
- interruptible
49
- end
50
-
51
- # Base class for all communication errors
52
- class ConnectionError < RuntimeError; end
53
- # Raised when a connection attempt has failed
54
- class ConnectionFailedError < RuntimeError
55
- def initialize(peer); @peer = peer end
56
- end
57
- # The peer is connected but connection is not alive
58
- class NotAliveError < ConnectionError; end
59
- # The peer is disconnected
60
- class DisconnectedError < ConnectionError; end
61
-
62
- class << self
63
- # This method will call PeerServer#trigger on all peers, for the
64
- # objects in +objects+ which are eligible for triggering.
65
- #
66
- # The same task cannot match the same trigger twice. To allow that,
67
- # call #clean_triggered.
68
- def trigger(*objects)
69
- return unless Roby::Distributed.state
70
- objects.delete_if do |o|
71
- o.plan != Roby::Distributed.state.plan ||
72
- !o.distribute? ||
73
- !o.self_owned?
74
- end
75
- return if objects.empty?
76
-
77
- # If +object+ is a trigger, send the :triggered event but do *not*
78
- # act as if +object+ was subscribed
79
- peers.each_value do |peer|
80
- peer.local_server.trigger(*objects)
81
- end
82
- end
83
- # Remove +objects+ from the sets of already-triggered objects. So, next
84
- # time +object+ will be tested for triggers, it will re-match the
85
- # triggers it has already matched.
86
- def clean_triggered(object)
87
- peers.each_value do |peer|
88
- peer.local_server.triggers.each_value do |_, triggered|
89
- triggered.delete object
90
- end
91
- end
92
- end
93
- end
94
-
95
- # PeerServer objects are the objects which act as servers for the plan
96
- # managers we are connected on, i.e. it will process the messages sent by
97
- # those remote plan managers.
98
- #
99
- # The client part, that is the part which actually send the messages, is
100
- # a Peer object accessible through the Peer#peer attribute.
101
- class PeerServer
102
- include DRbUndumped
103
-
104
- # The Peer object we are associated to
105
- attr_reader :peer
106
-
107
- # The set of triggers our peer has added to our plan
108
- attr_reader :triggers
109
-
110
- # Create a PeerServer object for the given peer
111
- def initialize(peer)
112
- @peer = peer
113
- @triggers = Hash.new
114
- end
115
-
116
- def to_s # :nodoc:
117
- "PeerServer:#{remote_name}"
118
- end
119
-
120
- # Activate any trigger that may exist on +objects+
121
- # It sends the PeerServer#triggered message for each objects that are
122
- # actually matching a registered trigger.
123
- def trigger(*objects)
124
- triggers.each do |id, (matcher, triggered)|
125
- objects.each do |object|
126
- if !triggered.include?(object) && matcher === object
127
- triggered << object
128
- peer.transmit(:triggered, id, object)
129
- end
130
- end
131
- end
132
- end
133
-
134
- # The name of the local ConnectionSpace object we are acting on
135
- def local_name; peer.local_name end
136
- # The name of the remote peer
137
- def remote_name; peer.remote_name end
138
-
139
- # The plan object which is used as a facade for our peer
140
- def plan; peer.connection_space.plan end
141
-
142
- # Applies +matcher+ on the local plan and sends back the result
143
- def query_result_set(query)
144
- plan.query_result_set(peer.local_object(query)).
145
- delete_if { |obj| !obj.distribute? }
146
- end
147
-
148
- # The peers asks to be notified if a plan object which matches
149
- # +matcher+ changes
150
- def add_trigger(id, matcher)
151
- triggers[id] = [matcher, (triggered = ValueSet.new)]
152
- Roby::Distributed.info "#{remote_name} wants notification on #{matcher} (#{id})"
153
-
154
- peer.queueing do
155
- matcher.each(plan) do |task|
156
- if !triggered.include?(task)
157
- triggered << task
158
- peer.transmit(:triggered, id, task)
159
- end
160
- end
161
- end
162
- nil
163
- end
164
-
165
- # Remove the trigger +id+ defined by this peer
166
- def remove_trigger(id)
167
- Roby::Distributed.info "#{remote_name} removed #{id} notification"
168
- triggers.delete(id)
169
- nil
170
- end
171
-
172
- # Message received when +task+ has matched the trigger referenced by +id+
173
- def triggered(id, task)
174
- peer.triggered(id, task)
175
- nil
176
- end
177
-
178
- # Send the neighborhood of +distance+ hops around +object+ to the peer
179
- def discover_neighborhood(object, distance)
180
- object = peer.local_object(object)
181
- edges = object.neighborhood(distance)
182
- if object.respond_to?(:each_plan_child)
183
- object.each_plan_child do |plan_child|
184
- edges += plan_child.neighborhood(distance)
185
- end
186
- end
187
-
188
- # Replace the relation graphs by their name
189
- edges.delete_if do |rel, from, to, info|
190
- !(rel.distribute? && from.distribute? && to.distribute?)
191
- end
192
- edges
193
- end
194
- end
195
-
196
- # A Peer object is the client part of a connection with a remote plan
197
- # manager. The server part, i.e. the object which actually receives
198
- # requests from the remote plan manager, is the PeerServer object
199
- # accessible through the Peer#local_server attribute.
200
- #
201
- # == Connection procedure
202
- #
203
- # Connections are initiated When the user calls Peer.initiate_connection.
204
- # The following protocol is then followed:
205
- # [local]
206
- # if the neighbour is already connected to us, we do nothing and yield
207
- # the already existing peer. End.
208
- # [local]
209
- # check if we are already connecting to the peer. If it is the case,
210
- # wait for the end of the connection thread.
211
- # [local]
212
- # otherwise, open a new socket and send the connect() message in it
213
- # The connection thread is registered in ConnectionSpace.pending_connections
214
- # [remote]
215
- # check if we are already connecting to the peer (check ConnectionSpace.pending_connections)
216
- # * if it is the case, the lowest token wins
217
- # * if 'remote' wins, return :already_connecting
218
- # * if 'local' wins, return :connected with the relevant information
219
- #
220
- # == Communication
221
- #
222
- # Communication is done in two threads. The sending thread gets the calls
223
- # from Peer#send_queue, formats them and sends them to the PeerServer#demux
224
- # for processing. The reception thread is managed by dRb and its entry
225
- # point is always #demux.
226
- #
227
- # Very often we need to have processing on both sides to finish an
228
- # operation. For instance, the creation of two siblings need to register
229
- # the siblings on both sides. To manage that, it is possible for PeerServer
230
- # methods which are serving a remote request to queue callbacks. These
231
- # callbacks will be processed by Peer#send_thread before the rest of the
232
- # queue might be processed
233
- class Peer
234
- include DRbUndumped
235
-
236
- # The local ConnectionSpace object we act on
237
- attr_reader :connection_space
238
- # The local PeerServer object for this peer
239
- attr_reader :local_server
240
- # The set of proxies for object from this remote peer
241
- attr_reader :proxies
242
- # The set of proxies we are currently removing. See BasicObject#forget_peer
243
- attr_reader :removing_proxies
244
- # The connection socket with our peer
245
- attr_reader :socket
246
-
247
- ComStats = Struct.new :rx, :tx
248
- # A ComStats object which holds the communication statistics for this peer
249
- # stats.tx is the count of bytes sent to the peer while stats.rx is the
250
- # count of bytes received
251
- attr_reader :stats
252
-
253
- def to_s # :nodoc:
254
- "Peer:#{remote_name}"
255
- end
256
- # This method is used by Distributed.format to determine the dumping
257
- # policy for +object+. If the method returns true, then only the
258
- # RemoteID object of +object+ will be sent to the peer. Otherwise,
259
- # an intermediate object describing +object+ is sent.
260
- def incremental_dump?(object)
261
- object.respond_to?(:remote_siblings) && object.remote_siblings[self]
262
- end
263
-
264
- # The object which identifies this peer on the network
265
- attr_reader :remote_id
266
- # The name of the remote peer
267
- attr_reader :remote_name
268
- # The [host, port] pair at the peer end
269
- attr_reader :peer_info
270
-
271
- # The name of the local ConnectionSpace object we are acting on
272
- def local_name; connection_space.name end
273
-
274
- # The ID => block hash of all triggers we have defined on the remote plan
275
- attr_reader :triggers
276
- # The remote state
277
- attr_accessor :state
278
-
279
- # The plan associated to our connection space
280
- def plan; connection_space.plan end
281
- # The execution engine associated to #plan
282
- def engine; connection_space.plan.engine end
283
-
284
- # Creates a Peer object for the peer connected at +socket+. This peer
285
- # is to be managed by +connection_space+ If a block is given, it is
286
- # called in the control thread when the connection is finalized
287
- def initialize(connection_space, socket, remote_name, remote_id, remote_state, &block)
288
- # Initialize the remote name with the socket parameters. It will be set to
289
- # the real name during the connection process
290
- @remote_name = remote_name
291
- @remote_id = remote_id
292
- @peer_info = socket.peer_info
293
-
294
- super() if defined? super
295
-
296
- @connection_space = connection_space
297
- @local_server = PeerServer.new(self)
298
- @proxies = Hash.new
299
- @removing_proxies = Hash.new { |h, k| h[k] = Array.new }
300
- @mutex = Mutex.new
301
- @triggers = Hash.new
302
- @socket = socket
303
- @stats = ComStats.new 0, 0
304
- @dead = false
305
- @disabled_rx = 0
306
- @disabled_tx = 0
307
- connection_space.pending_sockets << [socket, self]
308
-
309
- @connection_state = :connected
310
- @send_queue = Queue.new
311
- @completion_queue = Queue.new
312
- @current_cycle = Array.new
313
-
314
- Roby::Distributed.peers[remote_id] = self
315
- local_server.state_update remote_state
316
-
317
- @task = ConnectionTask.new :peer => self
318
- connection_space.plan.engine.once do
319
- connection_space.plan.add_permanent(task)
320
- task.start!
321
- task.emit(:ready)
322
- end
323
-
324
- @send_thread = Thread.new(&method(:communication_loop))
325
- end
326
-
327
- # The peer name
328
- attr_reader :name
329
- # The ConnectionTask object for this peer
330
- attr_reader :task
331
-
332
- # Creates a query object on the remote plan.
333
- #
334
- # For thread-safe operation, always use #each on the resulting query:
335
- # during the enumeration, the local plan GC will not remove those
336
- # tasks.
337
- def find_tasks
338
- Roby::Query.new(self)
339
- end
340
-
341
- # Returns a set of remote tasks for +query+ applied on the remote plan
342
- # This is not to be accessed directly. It is part of the Query
343
- # interface.
344
- #
345
- # See #find_tasks.
346
- def query_result_set(query)
347
- result = ValueSet.new
348
- call(:query_result_set, query) do |marshalled_set|
349
- for task in marshalled_set
350
- task = local_object(task)
351
- Roby::Distributed.keep.ref(task)
352
- result << task
353
- end
354
- end
355
-
356
- result
357
- end
358
-
359
- # Yields the tasks saved in +result_set+ by #query_result_set. During
360
- # the enumeration, the tasks are marked as permanent to avoid plan GC.
361
- # The block can subscribe to the one that are interesting. After the
362
- # block has returned, all non-subscribed tasks will be subject to plan
363
- # GC.
364
- def query_each(result_set) # :nodoc:
365
- result_set.each do |task|
366
- yield(task)
367
- end
368
-
369
- ensure
370
- Roby.synchronize do
371
- if result_set
372
- result_set.each do |task|
373
- Roby::Distributed.keep.deref(task)
374
- end
375
- end
376
- end
377
- end
378
-
379
- # call-seq:
380
- # peer.on(matcher) { |task| ... } => ID
381
- #
382
- # Call the provided block in the control thread when a task matching
383
- # +matcher+ has been found on the remote plan. +task+ is the local
384
- # proxy for the matching remote task.
385
- #
386
- # The return value is an identifier which can be later used to remove
387
- # the trigger with Peer#remove_trigger
388
- #
389
- # This sends the PeerServer#add_trigger message to the peer.
390
- def on(matcher, &block)
391
- triggers[matcher.object_id] = [matcher, block]
392
- transmit(:add_trigger, matcher.object_id, matcher)
393
- end
394
-
395
- # Remove a trigger referenced by its ID. +id+ is the value returned by
396
- # Peer#on
397
- #
398
- # This sends the PeerServer#remove_trigger message to the peer.
399
- def remove_trigger(id)
400
- transmit(:remove_trigger, id)
401
- triggers.delete(id)
402
- end
403
-
404
- # Calls the block given to Peer#on in a separate thread when +task+ has
405
- # matched the trigger
406
- def triggered(id, task) # :nodoc:
407
- task = local_object(task)
408
- Roby::Distributed.keep.ref(task)
409
- Thread.new do
410
- begin
411
- if trigger = triggers[id]
412
- trigger.last.call(task)
413
- end
414
- rescue Exception
415
- Roby::Distributed.warn "trigger handler #{trigger.last} failed with #{$!.full_message}"
416
- ensure
417
- Roby::Distributed.keep.deref(task)
418
- end
419
- end
420
- end
421
-
422
- # Returns true if this peer owns +object+
423
- def owns?(object); object.owners.include?(self) end
424
-
425
- # Returns the remote object for +object+. +object+ can be either a
426
- # DRbObject, a marshalled object or a local proxy. In the latter case,
427
- # a RemotePeerMismatch exception is raised if the local proxy is not
428
- # known to this peer.
429
- def remote_object(object)
430
- if object.kind_of?(RemoteID)
431
- object
432
- else object.sibling_on(self)
433
- end
434
- end
435
-
436
- # Returns the remote_object, local_object pair for +object+. +object+
437
- # can be either a marshalled object or a local proxy. Raises
438
- # ArgumentError if it is none of the two. In the latter case, a
439
- # RemotePeerMismatch exception is raised if the local proxy is not
440
- # known to this peer.
441
- def objects(object, create_local = true)
442
- if object.kind_of?(RemoteID)
443
- if local_proxy = proxies[object]
444
- proxy_setup(local_proxy)
445
- return [object, local_proxy]
446
- end
447
- raise ArgumentError, "got a RemoteID which has no proxy"
448
- elsif object.respond_to?(:proxy)
449
- [object.remote_object, proxy(object, create_local)]
450
- else
451
- [object.sibling_on(self), object]
452
- end
453
- end
454
-
455
- def proxy_setup(local_object)
456
- if local_object.respond_to?(:execution_agent) &&
457
- local_object.owners.size == 1 &&
458
- owns?(local_object) &&
459
- !local_object.execution_agent &&
460
- local_object.plan
461
-
462
- remote_owner = local_object.owners.first
463
- connection_task = local_object.plan[self.task]
464
-
465
- Roby::Distributed.update_all([local_object, connection_task]) do
466
- local_object.executed_by connection_task
467
- end
468
- end
469
-
470
- local_object
471
- end
472
-
473
- # Returns the local object for +object+. +object+ can be either a
474
- # marshalled object or a local proxy. Raises ArgumentError if it is
475
- # none of the two. In the latter case, a RemotePeerMismatch exception
476
- # is raised if the local proxy is not known to this peer.
477
- def local_object(marshalled, create = true)
478
- if marshalled.kind_of?(RemoteID)
479
- return marshalled.to_local(self, create)
480
- elsif !marshalled.respond_to?(:proxy)
481
- return marshalled
482
- elsif marshalled.respond_to?(:remote_siblings)
483
- # 1/ try any local RemoteID reference registered in the marshalled object
484
- local_id = marshalled.remote_siblings[Roby::Distributed.droby_dump]
485
- if local_id
486
- local_object = local_id.local_object rescue nil
487
- local_object = nil if local_object.finalized?
488
- end
489
-
490
- # 2/ try the #proxies hash
491
- if !local_object
492
- remote_id = marshalled.remote_siblings[droby_dump]
493
- unless local_object = proxies[remote_id]
494
- return if !create
495
-
496
- # remove any local ID since we are re-creating it
497
- marshalled.remote_siblings.delete(Roby::Distributed.droby_dump)
498
- local_object = marshalled.proxy(self)
499
- end
500
- end
501
-
502
- if !local_object
503
- raise "no remote siblings for #{remote_name} in #{marshalled} (#{marshalled.remote_siblings})"
504
- end
505
-
506
- if marshalled.respond_to?(:update)
507
- Roby::Distributed.update(local_object) do
508
- marshalled.update(self, local_object)
509
- end
510
- end
511
- proxy_setup(local_object)
512
- else
513
- local_object = marshalled.proxy(self)
514
- end
515
-
516
- local_object
517
- end
518
- alias proxy local_object
519
-
520
- # Discovers all objects at a distance +dist+ from +obj+. The object
521
- # can be either a remote proxy or the remote object itself
522
- def discover_neighborhood(object, distance)
523
- objects = ValueSet.new
524
- Roby.condition_variable(true) do |synchro, mutex|
525
- mutex.synchronize do
526
- transmit(:discover_neighborhood, object, distance) do |edges|
527
- edges = local_object(edges)
528
- edges.each do |rel, from, to, info|
529
- objects << from.root_object << to.root_object
530
- end
531
- Roby::Distributed.update_all(objects) do
532
- edges.each do |rel, from, to, info|
533
- from.add_child_object(to, rel, info)
534
- end
535
- end
536
-
537
- objects.each { |obj| Roby::Distributed.keep.ref(obj) }
538
-
539
- synchro.broadcast
540
- end
541
- synchro.wait(mutex)
542
- end
543
- end
544
-
545
- yield(local_object(remote_object(object)))
546
-
547
- Roby.synchronize do
548
- objects.each { |obj| Roby::Distributed.keep.deref(obj) }
549
- end
550
- end
551
- end
552
- end
553
-
554
- require 'roby/distributed/subscription'
555
-