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,31 +0,0 @@
1
- require 'roby'
2
- require 'roby/log/gui/replay'
3
- app = Qt::Application.new(ARGV)
4
- main = Replay.setup(ARGV)
5
-
6
- if ARGV.empty?
7
- Roby.app.setup
8
-
9
- streams = Roby.app.data_streams(Roby.app.log_dir)
10
- streams.each do |stream|
11
- stream.open
12
- main.add_stream(stream)
13
- end
14
- else
15
- ARGV.each do |file|
16
- if streams = Roby.app.data_source([file])
17
- streams.each { |s| s.open }
18
- main.add_stream(streams)
19
- else
20
- STDERR.puts "WARN: unknown file type #{file}"
21
- end
22
- end
23
- end
24
-
25
- begin
26
- main.show
27
- app.exec
28
- rescue
29
- STDERR.puts $!.full_message
30
- end
31
-
@@ -1,18 +0,0 @@
1
- require 'roby/log/server'
2
-
3
- app = Roby.app
4
- app.setup
5
- DRb.start_service "druby://:0"
6
-
7
- begin
8
- app.start_server
9
-
10
- Roby::Log::Server.info "ready"
11
- sleep
12
- rescue Interrupt
13
- ensure
14
- Roby::Log::Server.info "quitting"
15
- app.stop_server
16
- end
17
- Roby::Log::Server.info "quit"
18
-
@@ -1,151 +0,0 @@
1
- module Roby
2
- class BasicObject
3
- include DRbUndumped
4
-
5
- def initialize_copy(old) # :nodoc:
6
- super
7
-
8
- @remote_siblings = Hash[Distributed, Roby::Distributed::RemoteID.from_object(self)]
9
- end
10
-
11
- # The set of Peer objects which own this object
12
- attribute(:owners) { [Distributed] }
13
- # True if we own this object
14
- def self_owned?; owners.include?(Distributed) end
15
-
16
- # Attribute which overrides the #distribute attribute on object classes
17
- attr_writer :distribute
18
- # True if this object can be seen by remote hosts
19
- def distribute?
20
- @distribute || (@distribute.nil? && self.class.distribute?)
21
- end
22
-
23
- # True if instances of this class should be seen by remote hosts
24
- def self.distribute?; !(@distribute == false) end
25
- # Call to make the object of this class never seen by remote hosts
26
- def self.local_only; @distribute = false end
27
-
28
- def finalized?; !remote_siblings[Distributed] end
29
-
30
- # The peer => remote_object hash of known siblings for this peer: if
31
- # there is a representation of this object on a peer, then
32
- # +remote_siblings+ includes it
33
- attribute(:remote_siblings) { Hash[Distributed, remote_id] }
34
-
35
- # True if we know about a sibling on +peer+
36
- def has_sibling_on?(peer)
37
- peer == Roby::Distributed || remote_siblings.include?(peer)
38
- end
39
-
40
- # Returns the object representation of +self+ on +peer+. The returned
41
- # value is either a remote sibling (the DRbObject of the representation
42
- # of +self+ on +peer+), or self if peer is Roby::Distributed
43
- def sibling_on(peer)
44
- if sibling = remote_siblings[peer] then sibling
45
- elsif Roby::Distributed == peer then self
46
- else
47
- raise RemotePeerMismatch, "#{self} has no known sibling on #{peer}"
48
- end
49
- end
50
-
51
- # Sets +remote_object+ as the remote siblings for +self+ on +peer+, and
52
- # notifies peer that +self+ is the remote siblings for +remote_object+
53
- def sibling_of(remote_object, peer)
54
- if !distribute?
55
- raise ArgumentError, "#{self} is local only"
56
- end
57
-
58
- add_sibling_for(peer, remote_object)
59
- peer.transmit(:added_sibling, remote_object, remote_id)
60
- end
61
-
62
- # Called when all links to +peer+ should be removed.
63
- def forget_peer(peer)
64
- if remote_object = remove_sibling_for(peer)
65
- peer.removing_proxies[remote_object] << droby_dump(nil)
66
-
67
- if peer.connected?
68
- peer.transmit(:removed_sibling, remote_object, self.remote_id) do
69
- set = peer.removing_proxies[remote_object]
70
- set.shift
71
- if set.empty?
72
- peer.removing_proxies.delete(remote_object)
73
- end
74
- yield if block_given?
75
- end
76
- else
77
- peer.removing_proxies.delete(remote_object)
78
- end
79
- end
80
- end
81
-
82
- # Registers +remote_object+ as the sibling of +self+ on +peer+. Unlike
83
- # #sibling_of, do not notify the peer about it.
84
- def add_sibling_for(peer, remote_object)
85
- if old_sibling = remote_siblings[peer]
86
- if old_sibling != remote_object
87
- raise ArgumentError, "#{self} has already a sibling for #{peer} (#{old_sibling}) #{remote_siblings}"
88
- else
89
- # This is OK. The same sibling information can come from
90
- # different sources. We only check for inconsistencies
91
- return
92
- end
93
- end
94
-
95
- remote_siblings[peer] = remote_object
96
- peer.proxies[remote_object] = self
97
- Roby::Distributed.debug "added sibling #{remote_object.inspect} for #{self} on #{peer} (#{remote_siblings})"
98
- end
99
-
100
- # Remove references about the sibling registered for +peer+ and returns it
101
- def remove_sibling_for(peer, id = nil)
102
- if id && remote_siblings[peer] != id
103
- return
104
- end
105
-
106
- if remote_object = remote_siblings.delete(peer)
107
- peer.proxies.delete(remote_object)
108
- peer.subscriptions.delete(remote_object)
109
- Roby::Distributed.debug "removed sibling #{remote_object.inspect} for #{self} on #{peer}"
110
- remote_object
111
- end
112
- end
113
-
114
- # True if we explicitely want this object to be updated by our peers
115
- def subscribed?; owners.any? { |peer| peer.subscribed?(self) if peer != Distributed } end
116
-
117
- # Subscribe to this object on all the peers which own it.
118
- #
119
- # This is a blocking operation, and cannot be used in the control
120
- # thread.
121
- def subscribe
122
- if !self_owned? && !subscribed?
123
- owners.each do |peer|
124
- peer.subscribe(self) unless peer.subcribed?(self)
125
- end
126
- end
127
- end
128
-
129
- # True if this object is maintained up-to-date
130
- def updated?; self_owned? || owners.any?(&remote_siblings.method(:[])) end
131
- # True if +peer+ will send us updates about this object
132
- def updated_by?(peer); self_owned? || (remote_siblings[peer] && peer.owns?(self)) end
133
- # True if we shall send updates for this object on +peer+
134
- def update_on?(peer); (self_owned? || peer.owns?(self)) && remote_siblings[peer] end
135
- # The set of peers that will get updates of this object
136
- def updated_peers
137
- peers = remote_siblings.keys
138
- peers.delete(Distributed)
139
- peers
140
- end
141
-
142
- # True if this object is useful for our peers
143
- def remotely_useful?; self_owned? && remote_siblings.size > 1 end
144
-
145
- # True if this object can be modified in the current context
146
- def read_write?
147
- owners.include?(Distributed) || Distributed.updating?(self)
148
- end
149
- end
150
- end
151
-
@@ -1,14 +0,0 @@
1
- if RUBY_VERSION >= "1.9"
2
- STDERR.puts <<-EOB
3
- The stable version of Roby is not compatible with 1.9. If you really want to
4
- try it on 1.9, checkout the 1.9 branch of the development repository on github
5
- (see README.txt for URLs)
6
- EOB
7
- exit(1)
8
- end
9
-
10
- module Roby
11
- VERSION = '0.8.0'
12
- ROBY_LIB_DIR = File.expand_path( File.join(File.dirname(__FILE__), '..') )
13
- ROBY_ROOT_DIR = File.expand_path( File.join(ROBY_LIB_DIR, '..') )
14
- end
@@ -1,36 +0,0 @@
1
- require 'roby'
2
- require 'stringio'
3
- require 'roby/planning'
4
- require 'roby_marshalling'
5
- require 'roby/distributed/drb'
6
- require 'roby/distributed/protocol'
7
- require 'roby/distributed/base'
8
-
9
- require 'roby/distributed/proxy'
10
- require 'roby/distributed/connection_space'
11
- require 'roby/distributed/notifications'
12
- require 'roby/distributed/peer'
13
- require 'roby/distributed/transaction'
14
-
15
- # == Communication protocol (and code namespace structure)
16
- # == Getting remote objects
17
- # There is actually two ways to get a remote object
18
- # * the object has been explicitely subscribed to by calling Peer#subscribe
19
- # * the object has been sent to us because it is linked to an object we own
20
- # or an object we are subscribed to
21
- #
22
- # In the first case, the object must be referenced in the first place. It can
23
- # have been sent to us as a query result (see Query), or because it has been
24
- # involved in a distributed transaction. In the second case, it is either us
25
- # which have added the relation, or the remote peer. If it is us, we should
26
- # have subscribed to the object, added the relation, and then we may
27
- # unsubscribe to the object.
28
- #
29
- # We forget about a remote object when Plan#garbage_collect removes it.
30
- #
31
- # == Subscription management
32
- # The pDB gets updated about all objects it is subscribed to.
33
- module Roby::Distributed
34
- end
35
-
36
-
@@ -1,448 +0,0 @@
1
- require 'drb'
2
-
3
- # A thread-safe reference-counting class
4
- class RefCounting
5
- def initialize
6
- @values = Hash.new(0)
7
- @mutex = Mutex.new
8
- end
9
-
10
- # True if +obj+ is referenced
11
- def ref?(obj); @mutex.synchronize { @values[obj] > 0 } end
12
- # Dereference +obj+ by one
13
- def deref(obj)
14
- @mutex.synchronize do
15
- if (@values[obj] -= 1) == 0
16
- @values.delete(obj)
17
- return true
18
- end
19
- end
20
- false
21
- end
22
- # Add +1 to the reference count of +obj+
23
- def ref(obj)
24
- @mutex.synchronize do
25
- @values[obj] += 1
26
- end
27
- end
28
- # Returns the set of referenced objects
29
- def referenced_objects
30
- @mutex.synchronize do
31
- @values.keys
32
- end
33
- end
34
- # Remove +object+ from the set of referenced objects, regardless of its
35
- # reference count
36
- def delete(object)
37
- @mutex.synchronize do
38
- @values.delete(object)
39
- end
40
- end
41
- end
42
-
43
- class Object
44
- def initialize_copy(old) # :nodoc:
45
- super
46
- @__droby_remote_id__ = nil
47
- end
48
-
49
- # The Roby::Distributed::RemoteID for this object
50
- def remote_id
51
- @__droby_remote_id__ ||= Roby::Distributed::RemoteID.from_object(self)
52
- end
53
- end
54
-
55
- class DRbObject
56
- # We don't want this method to call the remote object.
57
- def to_s
58
- inspect
59
- end
60
- # Converts this DRbObject into Roby::Distributed::RemoteID
61
- def remote_id
62
- @__droby_remote_id__ ||= Roby::Distributed::RemoteID.new(__drburi, __drbref)
63
- end
64
- end
65
-
66
- module Roby
67
- module Distributed
68
- DISCOVERY_RING_PORT = 48901
69
- DEFAULT_DROBY_PORT = 48902
70
-
71
- class InvalidRemoteOperation < RuntimeError; end
72
-
73
- class InvalidRemoteTaskOperation < InvalidRemoteOperation
74
- attr_reader :task
75
- def initialize(task); @task = task end
76
- end
77
-
78
- extend Logger::Hierarchy
79
- extend Logger::Forward
80
-
81
- # RemoteID objects are used in dRoby to reference objects on other
82
- # peers. It uses the same mechanisms that DRbObject but is not
83
- # converted back into a local object automatically, and does not allow
84
- # to call remote methods on a remote object.
85
- class RemoteID
86
- # The URI of the DRb server
87
- attr_reader :uri
88
- # The reference ID of the object on the DRb server
89
- attr_reader :ref
90
-
91
- # Creates a new RemoteID with the given URI and ID
92
- def initialize(uri, ref)
93
- @uri, @ref = uri, ref.to_int
94
- @hash = [uri, ref].hash
95
- end
96
-
97
- def _dump(lvl) # :nodoc:
98
- @__droby_marshalled__ ||= Marshal.dump([uri, ref])
99
- end
100
- def self._load(str) # :nodoc:
101
- new(*Marshal.load(str))
102
- end
103
-
104
- def ==(other) # :nodoc:
105
- other.kind_of?(RemoteID) && other.ref == ref && other.uri == uri
106
- end
107
- alias :eql? :==
108
- attr_reader :hash
109
-
110
- # True if this object references a local object
111
- def local?; DRb.here?(uri) end
112
- # If this ID references a local object, returns it. Otherwise, returns self.
113
- def local_object
114
- if DRb.here?(uri)
115
- DRb.to_obj(ref)
116
- else
117
- self
118
- end
119
- end
120
-
121
- def to_s(peer = nil)
122
- if peer
123
- "0x#{Object.address_from_id(ref).to_s(16)}@#{peer.name}"
124
- else
125
- "0x#{Object.address_from_id(ref).to_s(16)}@#{uri}"
126
- end
127
- end
128
- def inspect; to_s end
129
- def pretty_print(pp); pp.text to_s end
130
-
131
- def to_local(peer, create)
132
- object = local_object
133
- if object.kind_of?(RemoteID)
134
- if local_proxy = peer.proxies[object]
135
- return peer.proxy_setup(local_proxy)
136
- elsif !create
137
- return
138
- elsif peer.removing_proxies.has_key?(object)
139
- marshalled_object = peer.removing_proxies[object].last
140
- Distributed.debug "reusing marshalled #{marshalled_object} for #{self} from #{peer}"
141
- marshalled_object.remote_siblings.delete(Distributed.droby_dump)
142
- marshalled_object.remote_siblings[peer.droby_dump] = self
143
-
144
- if marshalled_object.respond_to?(:plan) && !marshalled_object.plan
145
- # Take care of the "proxy is GCed while the peer
146
- # sends us messages about it" case. In this case,
147
- # the object has already been removed when it is
148
- # marshalled (#plan == nil).
149
- #
150
- # This cannot happen in transactions: it only happens
151
- # in plans where one side can remove an object while
152
- # the other side is doing something on it
153
- marshalled_object.instance_variable_set(:@plan, Roby.plan)
154
- end
155
-
156
- object = peer.local_object(marshalled_object)
157
-
158
- if object.respond_to?(:plan) && !object.plan
159
- raise "#{object} has no plan !"
160
- end
161
-
162
- return object
163
- end
164
- raise ArgumentError, "#{self} has no proxy"
165
- else
166
- object
167
- end
168
- end
169
-
170
- private :remote_id
171
-
172
- # Returns the RemoteID object for +obj+. This is actually
173
- # equivalent to obj.remote_id
174
- def self.from_object(obj)
175
- Roby::Distributed::RemoteID.new(DRb.current_server.uri, DRb.to_id(obj) || 0)
176
- end
177
-
178
- # Creates a DRbObject corresponding to the object referenced by this RemoteID
179
- def to_drb_object
180
- DRbObject.new_with(uri, (ref == 0 ? nil : ref))
181
- end
182
- end
183
-
184
- @updated_objects = ValueSet.new
185
- @allowed_remote_access = Array.new
186
- @keep = RefCounting.new
187
- @removed_objects = ValueSet.new
188
- class << self
189
- # The one and only ConnectionSpace object
190
- attr_reader :state
191
-
192
- # Sets the #state attribute for Roby::Distributed
193
- def state=(new_state)
194
- if log = logger
195
- if new_state
196
- logger.progname = new_state.name
197
- else
198
- logger.progname = "Roby"
199
- end
200
- end
201
-
202
- if !Roby.plan
203
- Roby.instance_variable_set :@plan, new_state.plan
204
- Roby.instance_variable_set :@engine, new_state.plan.engine
205
- elsif new_state && Roby.plan != new_state.plan
206
- raise ArgumentError, "plan mismatch between Roby.plan(#{plan}) and new_state.plan(#{new_state.plan}). Cannot set Distributed.state"
207
- end
208
-
209
- @state = new_state
210
- end
211
-
212
- # True if this plan manager owns +object+
213
- def owns?(object); !state || state.owns?(object) end
214
-
215
- # The set of objects we should temporarily keep because they are used
216
- # in a callback mechanism (like a remote query or a trigger)
217
- attr_reader :keep
218
-
219
- # Compute the subset of +candidates+ that are to be considered as
220
- # useful because of our peers and returns it.
221
- #
222
- # More specifically, an object will be included in the result if:
223
- # * this plan manager is subscribed to it
224
- # * the object is directly related to a self-owned object
225
- # * if +include_subscriptions_relations+ is true, +object+ is
226
- # directly related to a subscribed object.
227
- #
228
- # The method takes into account plan children in its computation:
229
- # for instance, a task will be included in the result if one of
230
- # its events meet the requirements described above.
231
- #
232
- # If +result+ is non-nil, the method adds the objects to +result+
233
- # using #<< and returns it.
234
- def remotely_useful_objects(candidates, include_subscriptions_relations, result = nil)
235
- return ValueSet.new if candidates.empty?
236
-
237
- result ||= Distributed.keep.referenced_objects.to_value_set
238
-
239
- child_set = ValueSet.new
240
- for obj in candidates
241
- if result.include?(obj.root_object)
242
- next
243
- elsif obj.subscribed?
244
- result << obj
245
- next
246
- end
247
-
248
- not_found = obj.each_relation do |rel|
249
- next unless rel.distribute? && rel.root_relation?
250
-
251
- not_found = obj.each_parent_object(rel) do |parent|
252
- parent = parent.root_object
253
- if parent.distribute? &&
254
- ((include_subscriptions_relations && parent.subscribed?) || parent.self_owned?)
255
- result << obj.root_object
256
- break
257
- end
258
- end
259
- break unless not_found
260
-
261
- not_found = obj.each_child_object(rel) do |child|
262
- child = child.root_object
263
- if child.distribute? &&
264
- ((include_subscriptions_relations && child.subscribed?) || child.self_owned?)
265
- result << obj.root_object
266
- break
267
- end
268
- end
269
- break unless not_found
270
- end
271
-
272
- if not_found && obj.respond_to?(:each_plan_child)
273
- obj.each_plan_child { |plan_child| child_set << plan_child }
274
- end
275
- end
276
-
277
- result.merge remotely_useful_objects(child_set, false, result)
278
- end
279
-
280
- # The list of objects that are being updated because of remote update
281
- attr_reader :updated_objects
282
-
283
- # True if we are updating +object+
284
- def updating?(object)
285
- updated_objects.include?(object)
286
- end
287
-
288
- # True if we are updating all objects in +objects+
289
- def updating_all?(objects)
290
- updated_objects.include_all?(objects.to_value_set)
291
- end
292
-
293
- # Call the block with the objects in +objects+ added to the
294
- # updated_objects set
295
- def update_all(objects)
296
- old_updated_objects = @updated_objects
297
- @updated_objects |= objects.to_value_set
298
- yield
299
- ensure
300
- @updated_objects = old_updated_objects
301
- end
302
-
303
- # Call the block with the objects in +objects+ added to the
304
- # updated_objects set
305
- def update(object)
306
- if object.respond_to?(:__getobj__) && !object.kind_of?(Roby::Transactions::Proxy)
307
- object = object.__getobj__
308
- end
309
-
310
- included = unless updated_objects.include?(object)
311
- @updated_objects << object
312
- end
313
-
314
- yield
315
- ensure
316
- @updated_objects.delete(object) if included
317
- end
318
-
319
- # Yields the relations of +object+ which are to be distributed
320
- # among peers.
321
- def each_object_relation(object)
322
- object.each_relation do |rel|
323
- yield(rel) if rel.distribute?
324
- end
325
- end
326
-
327
- # The list of known peers. See ConnectionSpace#peers
328
- def peers
329
- if state then state.peers
330
- else {}
331
- end
332
- end
333
-
334
- # The set of objects that have been removed locally, but for which
335
- # there are still references on our peers
336
- attr_reader :removed_objects
337
- end
338
-
339
- @cycles_rx = Queue.new
340
- @pending_cycles = Array.new
341
- @pending_remote_events = Array.new
342
-
343
- class << self
344
- # The queue of cycles read by ConnectionSpace#receive and not processed
345
- attr_reader :cycles_rx
346
- # The set of cycles that have been read from #pending_cycles but
347
- # have not been processed yet because the peers have disabled_rx? set
348
- #
349
- # This variable must be accessed only in the control thread
350
- attr_reader :pending_cycles
351
- end
352
-
353
- # Extract data received so far from our peers and replays it if
354
- # possible. Data can be ignored if RX is disabled with this peer
355
- # (through Peer#disable_rx), or delayed if there is event propagation
356
- # involved. In that last case, the events will be fired at the
357
- # beginning of the next execution cycle and the remaining messages at
358
- # the end of that same cycle.
359
- def self.process_pending
360
- delayed_cycles = []
361
- while !(pending_cycles.empty? && cycles_rx.empty?)
362
- peer, calls = if pending_cycles.empty?
363
- cycles_rx.pop
364
- else pending_cycles.shift
365
- end
366
-
367
- if peer.disabled_rx?
368
- delayed_cycles.push [peer, calls]
369
- else
370
- if remaining = process_cycle(peer, calls)
371
- delayed_cycles.push [peer, remaining]
372
- end
373
- end
374
- end
375
-
376
- ensure
377
- @pending_cycles = delayed_cycles
378
- end
379
-
380
- # Process once cycle worth of data from the given peer.
381
- def self.process_cycle(peer, calls)
382
- from = Time.now
383
- calls_size = calls.size
384
-
385
- peer_server = peer.local_server
386
- peer_server.processing = true
387
-
388
- if !peer.connected?
389
- return
390
- end
391
-
392
- while call_spec = calls.shift
393
- return unless call_spec
394
-
395
- is_callback, method, args, critical, message_id = *call_spec
396
- Distributed.debug do
397
- args_s = args.map { |obj| obj ? obj.to_s : 'nil' }
398
- "processing #{is_callback ? 'callback' : 'method'} [#{message_id}]#{method}(#{args_s.join(", ")})"
399
- end
400
-
401
- result = catch(:ignore_this_call) do
402
- peer_server.queued_completion = false
403
- peer_server.current_message_id = message_id
404
- peer_server.processing_callback = !!is_callback
405
-
406
- result = begin
407
- peer_server.send(method, *args)
408
- rescue Exception => e
409
- if critical
410
- peer.fatal_error e, method, args
411
- else
412
- peer_server.completed!(e, true)
413
- end
414
- end
415
-
416
- if !peer.connected?
417
- return
418
- end
419
- result
420
- end
421
-
422
- if method != :completed && method != :completion_group && !peer.disconnecting? && !peer.disconnected?
423
- if peer_server.queued_completion?
424
- Distributed.debug "done and already queued the completion message"
425
- else
426
- Distributed.debug { "done, returns #{result || 'nil'}" }
427
- peer.queue_call false, :completed, [result, false, message_id]
428
- end
429
- end
430
-
431
- if peer.disabled_rx?
432
- return calls
433
- end
434
-
435
- end
436
-
437
- Distributed.debug "successfully served #{calls_size} calls in #{Time.now - from} seconds"
438
- nil
439
-
440
- rescue Exception => e
441
- Distributed.info "error in dRoby processing: #{e.full_message}"
442
- peer.disconnect
443
-
444
- ensure
445
- peer_server.processing = false
446
- end
447
- end
448
- end