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.
- checksums.yaml +7 -0
- data/.deep-cover.rb +3 -0
- data/.gitattributes +1 -0
- data/.gitignore +24 -0
- data/.simplecov +10 -0
- data/.travis.yml +17 -0
- data/.yardopts +4 -0
- data/Gemfile +15 -0
- data/README.md +11 -0
- data/Rakefile +47 -177
- data/benchmark/{alloc_misc.rb → attic/alloc_misc.rb} +2 -2
- data/benchmark/{discovery_latency.rb → attic/discovery_latency.rb} +19 -19
- data/benchmark/{garbage_collection.rb → attic/garbage_collection.rb} +9 -9
- data/benchmark/{genom.rb → attic/genom.rb} +0 -0
- data/benchmark/attic/transactions.rb +62 -0
- data/benchmark/plan_basic_operations.rb +28 -0
- data/benchmark/relations/graph.rb +63 -0
- data/benchmark/ruby/identity.rb +18 -0
- data/benchmark/ruby/set_intersect_vs_hash_merge.rb +39 -0
- data/benchmark/ruby/yield_vs_block.rb +35 -0
- data/benchmark/run +5 -0
- data/benchmark/synthetic_plan_modifications_with_transactions.rb +79 -0
- data/benchmark/transactions.rb +99 -51
- data/bin/roby +38 -197
- data/bin/roby-display +14 -0
- data/bin/roby-log +3 -176
- data/doc/guide/{src → attic}/abstraction/achieve_with.page +1 -1
- data/doc/guide/{src → attic}/abstraction/forwarding.page +1 -1
- data/doc/guide/{src → attic}/abstraction/hierarchy.page +1 -1
- data/doc/guide/{src → attic}/abstraction/index.page +1 -1
- data/doc/guide/{src → attic}/abstraction/task_models.page +1 -1
- data/doc/guide/{overview.rdoc → attic/cycle/api_overview.rdoc} +6 -1
- data/doc/guide/{src → attic}/cycle/cycle-overview.png +0 -0
- data/doc/guide/{src → attic}/cycle/cycle-overview.svg +0 -0
- data/doc/guide/attic/cycle/error_handling.page +98 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.png +0 -0
- data/doc/guide/{src → attic}/cycle/error_instantaneous_repair.svg +0 -0
- data/doc/guide/{src/cycle/error_handling.page → attic/cycle/error_sources.page} +46 -89
- data/doc/guide/{src → attic}/cycle/garbage_collection.page +1 -1
- data/doc/guide/{src → attic}/cycle/index.page +1 -1
- data/doc/guide/{src → attic}/cycle/propagation.page +11 -1
- data/doc/guide/{src → attic}/cycle/propagation_diamond.png +0 -0
- data/doc/guide/{src → attic}/cycle/propagation_diamond.svg +0 -0
- data/doc/guide/attic/plans/building_plans.page +89 -0
- data/doc/guide/attic/plans/code.page +192 -0
- data/doc/guide/{src/basics → attic/plans}/events.page +3 -4
- data/doc/guide/attic/plans/index.page +7 -0
- data/doc/guide/{plan_modifications.rdoc → attic/plans/plan_modifications.rdoc} +5 -3
- data/doc/guide/{src/basics → attic/plans}/plan_objects.page +2 -1
- data/doc/guide/attic/plans/querying_plans.page +5 -0
- data/doc/guide/{src/basics → attic/plans}/tasks.page +20 -20
- data/doc/guide/config.yaml +7 -4
- data/doc/guide/ext/extended_menu.rb +29 -0
- data/doc/guide/ext/init.rb +6 -0
- data/doc/guide/ext/rdoc_links.rb +7 -6
- data/doc/guide/src/advanced_concepts/history.page +5 -0
- data/doc/guide/src/advanced_concepts/index.page +11 -0
- data/doc/guide/src/advanced_concepts/recognizing_patterns.page +83 -0
- data/doc/guide/src/advanced_concepts/scheduling.page +87 -0
- data/doc/guide/src/advanced_concepts/transactions.page +5 -0
- data/doc/guide/src/advanced_concepts/unreachability.page +42 -0
- data/doc/guide/src/base.template +96 -0
- data/doc/guide/src/basics_shell_header.txt +5 -7
- data/doc/guide/src/building/action_coordination.page +96 -0
- data/doc/guide/src/building/actions.page +124 -0
- data/doc/guide/src/building/file_layout.page +71 -0
- data/doc/guide/src/building/index.page +50 -0
- data/doc/guide/src/building/patterns.page +86 -0
- data/doc/guide/src/building/patterns_forwarding.png +0 -0
- data/doc/guide/src/building/patterns_forwarding.svg +277 -0
- data/doc/guide/src/building/runtime.page +95 -0
- data/doc/guide/src/building/task_models.page +94 -0
- data/doc/guide/src/building/tasks.page +284 -0
- data/doc/guide/src/concepts/error_handling.page +100 -0
- data/doc/guide/src/concepts/exception_propagation.png +0 -0
- data/doc/guide/src/concepts/exception_propagation.svg +445 -0
- data/doc/guide/src/concepts/execution.page +85 -0
- data/doc/guide/src/concepts/execution.png +0 -0
- data/doc/guide/src/concepts/execution.svg +573 -0
- data/doc/guide/src/concepts/execution_cycle.png +0 -0
- data/doc/guide/src/concepts/garbage_collection.page +57 -0
- data/doc/guide/src/concepts/index.page +27 -0
- data/doc/guide/src/concepts/plans.page +101 -0
- data/doc/guide/src/concepts/policy.page +31 -0
- data/doc/guide/src/concepts/reactor.page +61 -0
- data/doc/guide/src/concepts/simple_plan_example.png +0 -0
- data/doc/guide/src/concepts/simple_plan_example.svg +376 -0
- data/doc/guide/src/default.template +9 -74
- data/doc/guide/src/event_relations/forward.page +71 -0
- data/doc/guide/src/event_relations/index.page +12 -0
- data/doc/guide/src/event_relations/scheduling_constraints.page +43 -0
- data/doc/guide/src/event_relations/signal.page +55 -0
- data/doc/guide/src/event_relations/temporal_constraints.page +77 -0
- data/doc/guide/src/htmldoc.metainfo +21 -8
- data/doc/guide/src/index.page +8 -3
- data/doc/guide/src/{introduction/install.page → installation/index.page} +37 -25
- data/doc/guide/src/installation/publications.page +14 -0
- data/doc/guide/src/{introduction → installation}/videos.page +14 -7
- data/doc/guide/src/interacting/index.page +16 -0
- data/doc/guide/src/interacting/run.page +33 -0
- data/doc/guide/src/interacting/shell.page +95 -0
- data/doc/guide/src/plugins/creating_plugins.page +72 -0
- data/doc/guide/src/plugins/index.page +27 -5
- data/doc/guide/src/plugins/{fault_tolerance.page → standard_plugins/fault_tolerance.page} +2 -2
- data/doc/guide/src/plugins/standard_plugins/index.page +11 -0
- data/doc/guide/src/plugins/{subsystems.page → standard_plugins/subsystems.page} +2 -2
- data/doc/guide/src/style_screen.css +687 -0
- data/doc/guide/src/task_relations/dependency.page +107 -0
- data/doc/guide/src/task_relations/executed_by.page +77 -0
- data/doc/guide/src/task_relations/index.page +12 -0
- data/doc/guide/src/task_relations/new_relations.page +119 -0
- data/doc/guide/src/task_relations/planned_by.page +46 -0
- data/doc/guide/src/tutorial/app.page +117 -0
- data/doc/guide/src/{basics → tutorial}/code_examples.page +6 -5
- data/doc/guide/src/{basics → tutorial}/dry.page +15 -15
- data/doc/guide/src/{basics → tutorial}/errors.page +43 -68
- data/doc/guide/src/tutorial/events.page +195 -0
- data/doc/guide/src/{basics → tutorial}/hierarchy.page +53 -52
- data/doc/guide/src/tutorial/index.page +13 -0
- data/doc/guide/src/tutorial/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/goForward_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/hierarchy_error_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/moveto_code_error.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_1.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_2.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/plan_repair_3.png +0 -0
- data/doc/guide/src/tutorial/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/tutorial/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_log_relation_window.png +0 -0
- data/doc/guide/src/{basics → tutorial}/log_replay/roby_replay_event_representation.png +0 -0
- data/doc/guide/src/tutorial/relations_display.page +153 -0
- data/doc/guide/src/{basics → tutorial}/roby_cycle_overview.png +0 -0
- data/doc/guide/src/tutorial/shell.page +121 -0
- data/doc/guide/src/{basics → tutorial}/summary.page +1 -1
- data/doc/guide/src/tutorial/tasks.page +374 -0
- data/lib/roby.rb +102 -47
- data/lib/roby/actions.rb +17 -0
- data/lib/roby/actions/action.rb +80 -0
- data/lib/roby/actions/interface.rb +45 -0
- data/lib/roby/actions/library.rb +23 -0
- data/lib/roby/actions/models/action.rb +224 -0
- data/lib/roby/actions/models/coordination_action.rb +58 -0
- data/lib/roby/actions/models/interface.rb +22 -0
- data/lib/roby/actions/models/interface_base.rb +294 -0
- data/lib/roby/actions/models/library.rb +12 -0
- data/lib/roby/actions/models/method_action.rb +90 -0
- data/lib/roby/actions/task.rb +114 -0
- data/lib/roby/and_generator.rb +125 -0
- data/lib/roby/app.rb +2795 -829
- data/lib/roby/app/autotest_console_reporter.rb +138 -0
- data/lib/roby/app/base.rb +21 -0
- data/lib/roby/app/cucumber.rb +2 -0
- data/lib/roby/app/cucumber/controller.rb +439 -0
- data/lib/roby/app/cucumber/helpers.rb +280 -0
- data/lib/roby/app/cucumber/world.rb +32 -0
- data/lib/roby/app/debug.rb +136 -0
- data/lib/roby/app/gen.rb +2 -0
- data/lib/roby/app/rake.rb +178 -38
- data/lib/roby/app/robot_config.rb +9 -0
- data/lib/roby/app/robot_names.rb +115 -0
- data/lib/roby/app/run.rb +3 -2
- data/lib/roby/app/scripts.rb +72 -0
- data/lib/roby/app/scripts/autotest.rb +173 -0
- data/lib/roby/app/scripts/display.rb +2 -0
- data/lib/roby/app/scripts/restart.rb +52 -0
- data/lib/roby/app/scripts/results.rb +17 -8
- data/lib/roby/app/scripts/run.rb +155 -24
- data/lib/roby/app/scripts/shell.rb +147 -62
- data/lib/roby/app/scripts/test.rb +107 -22
- data/lib/roby/app/test_reporter.rb +74 -0
- data/lib/roby/app/test_server.rb +159 -0
- data/lib/roby/app/vagrant.rb +47 -0
- data/lib/roby/backports.rb +16 -0
- data/lib/roby/cli/display.rb +190 -0
- data/lib/roby/cli/exceptions.rb +17 -0
- data/lib/roby/cli/gen/actions/class.rb +5 -0
- data/lib/roby/cli/gen/actions/test.rb +6 -0
- data/lib/roby/cli/gen/app/.yardopts +6 -0
- data/lib/roby/cli/gen/app/README.md +28 -0
- data/lib/roby/cli/gen/app/Rakefile +15 -0
- data/{app → lib/roby/cli/gen/app}/config/app.yml +29 -39
- data/lib/roby/cli/gen/app/models/.gitattributes +1 -0
- data/{app → lib/roby/cli/gen/app/scripts}/controllers/.gitattributes +0 -0
- data/{app/data/.gitattributes → lib/roby/cli/gen/app/test/.gitignore} +0 -0
- data/lib/roby/cli/gen/class/class.rb +6 -0
- data/lib/roby/cli/gen/class/test.rb +7 -0
- data/lib/roby/cli/gen/helpers.rb +203 -0
- data/lib/roby/cli/gen/module/module.rb +5 -0
- data/lib/roby/cli/gen/module/test.rb +6 -0
- data/lib/roby/cli/gen/roby_app/config/init.rb +17 -0
- data/lib/roby/cli/gen/roby_app/config/robots/robot.rb +40 -0
- data/lib/roby/cli/gen/task/class.rb +44 -0
- data/lib/roby/cli/gen/task/test.rb +6 -0
- data/lib/roby/cli/gen_main.rb +120 -0
- data/lib/roby/cli/log.rb +276 -0
- data/lib/roby/cli/log/flamegraph.html +499 -0
- data/lib/roby/cli/log/flamegraph_renderer.rb +88 -0
- data/lib/roby/cli/main.rb +153 -0
- data/lib/roby/coordination.rb +60 -0
- data/lib/roby/coordination/action_script.rb +25 -0
- data/lib/roby/coordination/action_state_machine.rb +125 -0
- data/lib/roby/coordination/actions.rb +106 -0
- data/lib/roby/coordination/base.rb +145 -0
- data/lib/roby/coordination/calculus.rb +40 -0
- data/lib/roby/coordination/child.rb +28 -0
- data/lib/roby/coordination/event.rb +29 -0
- data/lib/roby/coordination/fault_handler.rb +25 -0
- data/lib/roby/coordination/fault_handling_task.rb +13 -0
- data/lib/roby/coordination/fault_response_table.rb +110 -0
- data/lib/roby/coordination/models/action_script.rb +64 -0
- data/lib/roby/coordination/models/action_state_machine.rb +224 -0
- data/lib/roby/coordination/models/actions.rb +191 -0
- data/lib/roby/coordination/models/arguments.rb +55 -0
- data/lib/roby/coordination/models/base.rb +176 -0
- data/lib/roby/coordination/models/capture.rb +86 -0
- data/lib/roby/coordination/models/child.rb +35 -0
- data/lib/roby/coordination/models/event.rb +41 -0
- data/lib/roby/coordination/models/exceptions.rb +42 -0
- data/lib/roby/coordination/models/fault_handler.rb +219 -0
- data/lib/roby/coordination/models/fault_response_table.rb +77 -0
- data/lib/roby/coordination/models/root.rb +22 -0
- data/lib/roby/coordination/models/script.rb +283 -0
- data/lib/roby/coordination/models/task.rb +184 -0
- data/lib/roby/coordination/models/task_from_action.rb +50 -0
- data/lib/roby/coordination/models/task_from_as_plan.rb +33 -0
- data/lib/roby/coordination/models/task_from_instanciation_object.rb +31 -0
- data/lib/roby/coordination/models/task_from_variable.rb +27 -0
- data/lib/roby/coordination/models/task_with_dependencies.rb +48 -0
- data/lib/roby/coordination/models/variable.rb +32 -0
- data/lib/roby/coordination/script.rb +200 -0
- data/lib/roby/coordination/script_instruction.rb +12 -0
- data/lib/roby/coordination/task.rb +45 -0
- data/lib/roby/coordination/task_base.rb +69 -0
- data/lib/roby/coordination/task_script.rb +293 -0
- data/lib/roby/coordination/task_state_machine.rb +308 -0
- data/lib/roby/decision_control.rb +33 -21
- data/lib/roby/distributed_object.rb +76 -0
- data/lib/roby/droby.rb +17 -0
- data/lib/roby/droby/droby_id.rb +6 -0
- data/lib/roby/droby/enable.rb +153 -0
- data/lib/roby/droby/event_logger.rb +189 -0
- data/lib/roby/droby/event_logging.rb +57 -0
- data/lib/roby/droby/exceptions.rb +14 -0
- data/lib/roby/droby/identifiable.rb +22 -0
- data/lib/roby/droby/logfile.rb +141 -0
- data/lib/roby/droby/logfile/client.rb +176 -0
- data/lib/roby/droby/logfile/file_format.md +97 -0
- data/lib/roby/droby/logfile/index.rb +117 -0
- data/lib/roby/droby/logfile/reader.rb +139 -0
- data/lib/roby/droby/logfile/server.rb +199 -0
- data/lib/roby/droby/logfile/writer.rb +114 -0
- data/lib/roby/droby/marshal.rb +264 -0
- data/lib/roby/droby/marshallable.rb +12 -0
- data/lib/roby/droby/null_event_logger.rb +25 -0
- data/lib/roby/droby/object_manager.rb +205 -0
- data/lib/roby/droby/peer_id.rb +6 -0
- data/lib/roby/droby/plan_rebuilder.rb +373 -0
- data/lib/roby/droby/rebuilt_plan.rb +160 -0
- data/lib/roby/droby/remote_droby_id.rb +6 -0
- data/lib/roby/droby/timepoints.rb +205 -0
- data/lib/roby/droby/timepoints_ctf.metadata.erb +101 -0
- data/lib/roby/droby/timepoints_ctf.rb +125 -0
- data/lib/roby/droby/v5.rb +14 -0
- data/lib/roby/droby/v5/builtin.rb +120 -0
- data/lib/roby/droby/v5/droby_class.rb +45 -0
- data/lib/roby/droby/v5/droby_constant.rb +81 -0
- data/lib/roby/droby/v5/droby_dump.rb +1026 -0
- data/lib/roby/droby/v5/droby_id.rb +44 -0
- data/lib/roby/droby/v5/droby_model.rb +82 -0
- data/lib/roby/droby/v5/peer_id.rb +10 -0
- data/lib/roby/droby/v5/remote_droby_id.rb +42 -0
- data/lib/roby/event.rb +79 -957
- data/lib/roby/event_constraints.rb +835 -0
- data/lib/roby/event_generator.rb +1047 -0
- data/lib/roby/event_structure/causal_link.rb +6 -0
- data/lib/roby/event_structure/forwarding.rb +6 -0
- data/lib/roby/event_structure/precedence.rb +7 -0
- data/lib/roby/event_structure/signal.rb +8 -0
- data/lib/roby/event_structure/temporal_constraints.rb +640 -0
- data/lib/roby/exceptions.rb +446 -152
- data/lib/roby/executable_plan.rb +549 -0
- data/lib/roby/execution_engine.rb +1997 -950
- data/lib/roby/filter_generator.rb +26 -0
- data/lib/roby/gui/chronicle_view.rb +225 -0
- data/lib/roby/gui/chronicle_widget.rb +925 -0
- data/lib/roby/gui/dot_id.rb +11 -0
- data/lib/roby/gui/exception_view.rb +44 -0
- data/lib/roby/gui/log_display.rb +273 -0
- data/lib/roby/gui/model_views.rb +2 -0
- data/lib/roby/gui/model_views/action_interface.rb +53 -0
- data/lib/roby/gui/model_views/task.rb +47 -0
- data/lib/roby/gui/model_views/task.rhtml +41 -0
- data/lib/roby/gui/object_info_view.rb +89 -0
- data/lib/roby/gui/plan_dot_layout.rb +427 -0
- data/lib/roby/gui/plan_rebuilder_widget.rb +357 -0
- data/lib/roby/gui/qt4_toMSecsSinceEpoch.rb +8 -0
- data/lib/roby/gui/relations_view.rb +278 -0
- data/lib/roby/gui/relations_view/relations.ui +139 -0
- data/lib/roby/gui/relations_view/relations_canvas.rb +1088 -0
- data/lib/roby/gui/relations_view/relations_config.rb +292 -0
- data/lib/roby/gui/relations_view/relations_view.ui +53 -0
- data/lib/roby/gui/scheduler_view.css +24 -0
- data/lib/roby/gui/scheduler_view.rb +46 -0
- data/lib/roby/gui/scheduler_view.rhtml +53 -0
- data/lib/roby/gui/stepping.rb +93 -0
- data/lib/roby/gui/stepping.ui +181 -0
- data/lib/roby/gui/styles.rb +81 -0
- data/lib/roby/gui/task_display_configuration.rb +42 -0
- data/lib/roby/gui/task_state_at.rb +38 -0
- data/lib/roby/hooks.rb +26 -0
- data/lib/roby/interface.rb +136 -469
- data/lib/roby/interface/async.rb +20 -0
- data/lib/roby/interface/async/action_monitor.rb +188 -0
- data/lib/roby/interface/async/interface.rb +498 -0
- data/lib/roby/interface/async/job_monitor.rb +213 -0
- data/lib/roby/interface/async/log.rb +238 -0
- data/lib/roby/interface/async/new_job_listener.rb +79 -0
- data/lib/roby/interface/async/ui_connector.rb +183 -0
- data/lib/roby/interface/client.rb +553 -0
- data/lib/roby/interface/command.rb +24 -0
- data/lib/roby/interface/command_argument.rb +16 -0
- data/lib/roby/interface/command_library.rb +92 -0
- data/lib/roby/interface/droby_channel.rb +174 -0
- data/lib/roby/interface/exceptions.rb +22 -0
- data/lib/roby/interface/interface.rb +655 -0
- data/lib/roby/interface/job.rb +47 -0
- data/lib/roby/interface/rest.rb +10 -0
- data/lib/roby/interface/rest/api.rb +29 -0
- data/lib/roby/interface/rest/helpers.rb +24 -0
- data/lib/roby/interface/rest/server.rb +212 -0
- data/lib/roby/interface/server.rb +154 -0
- data/lib/roby/interface/shell_client.rb +468 -0
- data/lib/roby/interface/shell_subcommand.rb +24 -0
- data/lib/roby/interface/subcommand_client.rb +35 -0
- data/lib/roby/interface/tcp.rb +168 -0
- data/lib/roby/models/arguments.rb +112 -0
- data/lib/roby/models/plan_object.rb +83 -0
- data/lib/roby/models/task.rb +835 -0
- data/lib/roby/models/task_event.rb +62 -0
- data/lib/roby/models/task_service.rb +78 -0
- data/lib/roby/or_generator.rb +88 -0
- data/lib/roby/plan.rb +1751 -864
- data/lib/roby/plan_object.rb +611 -0
- data/lib/roby/plan_service.rb +200 -0
- data/lib/roby/promise.rb +332 -0
- data/lib/roby/queries.rb +23 -0
- data/lib/roby/queries/and_matcher.rb +32 -0
- data/lib/roby/queries/any.rb +27 -0
- data/lib/roby/queries/code_error_matcher.rb +58 -0
- data/lib/roby/queries/event_generator_matcher.rb +9 -0
- data/lib/roby/queries/execution_exception_matcher.rb +165 -0
- data/lib/roby/queries/index.rb +165 -0
- data/lib/roby/queries/localized_error_matcher.rb +149 -0
- data/lib/roby/queries/matcher_base.rb +107 -0
- data/lib/roby/queries/none.rb +27 -0
- data/lib/roby/queries/not_matcher.rb +30 -0
- data/lib/roby/queries/op_matcher.rb +8 -0
- data/lib/roby/queries/or_matcher.rb +30 -0
- data/lib/roby/queries/plan_object_matcher.rb +363 -0
- data/lib/roby/queries/query.rb +188 -0
- data/lib/roby/queries/task_event_generator_matcher.rb +86 -0
- data/lib/roby/queries/task_matcher.rb +344 -0
- data/lib/roby/relations.rb +42 -678
- data/lib/roby/relations/bidirectional_directed_adjacency_graph.rb +492 -0
- data/lib/roby/relations/directed_relation_support.rb +268 -0
- data/lib/roby/relations/event_relation_graph.rb +19 -0
- data/lib/roby/relations/fork_merge_visitor.rb +154 -0
- data/lib/roby/relations/graph.rb +533 -0
- data/lib/roby/relations/models/directed_relation_support.rb +11 -0
- data/lib/roby/relations/models/graph.rb +75 -0
- data/lib/roby/relations/models/task_relation_graph.rb +18 -0
- data/lib/roby/relations/space.rb +380 -0
- data/lib/roby/relations/task_relation_graph.rb +20 -0
- data/lib/roby/robot.rb +85 -38
- data/lib/roby/schedulers/basic.rb +155 -25
- data/lib/roby/schedulers/null.rb +20 -0
- data/lib/roby/schedulers/reporting.rb +31 -0
- data/lib/roby/schedulers/state.rb +129 -0
- data/lib/roby/schedulers/temporal.rb +91 -0
- data/lib/roby/singletons.rb +87 -0
- data/lib/roby/standalone.rb +4 -2
- data/lib/roby/standard_errors.rb +405 -82
- data/lib/roby/state.rb +6 -3
- data/lib/roby/state/conf_model.rb +5 -0
- data/lib/roby/state/events.rb +181 -95
- data/lib/roby/state/goal_model.rb +77 -0
- data/lib/roby/state/open_struct.rb +591 -0
- data/lib/roby/state/open_struct_model.rb +68 -0
- data/lib/roby/state/pos.rb +45 -45
- data/lib/roby/state/shapes.rb +11 -11
- data/lib/roby/state/state_model.rb +303 -0
- data/lib/roby/state/task.rb +43 -0
- data/lib/roby/support.rb +88 -148
- data/lib/roby/task.rb +1361 -1750
- data/lib/roby/task_arguments.rb +428 -0
- data/lib/roby/task_event.rb +127 -0
- data/lib/roby/task_event_generator.rb +337 -0
- data/lib/roby/task_service.rb +6 -0
- data/lib/roby/task_structure/conflicts.rb +104 -0
- data/lib/roby/task_structure/dependency.rb +932 -0
- data/lib/roby/task_structure/error_handling.rb +118 -0
- data/lib/roby/task_structure/executed_by.rb +234 -0
- data/lib/roby/task_structure/planned_by.rb +90 -0
- data/lib/roby/tasks/aggregator.rb +37 -0
- data/lib/roby/tasks/external_process.rb +275 -0
- data/lib/roby/tasks/group.rb +27 -0
- data/lib/roby/tasks/null.rb +19 -0
- data/lib/roby/tasks/parallel.rb +43 -0
- data/lib/roby/tasks/sequence.rb +88 -0
- data/lib/roby/tasks/simple.rb +21 -0
- data/lib/roby/{thread_task.rb → tasks/thread.rb} +50 -24
- data/lib/roby/tasks/timeout.rb +17 -0
- data/lib/roby/tasks/virtual.rb +55 -0
- data/lib/roby/template_plan.rb +7 -0
- data/lib/roby/test/aruba_minitest.rb +74 -0
- data/lib/roby/test/assertion.rb +16 -0
- data/lib/roby/test/assertions.rb +490 -0
- data/lib/roby/test/common.rb +368 -591
- data/lib/roby/test/dsl.rb +149 -0
- data/lib/roby/test/error.rb +18 -0
- data/lib/roby/test/event_reporter.rb +83 -0
- data/lib/roby/test/execution_expectations.rb +1134 -0
- data/lib/roby/test/expect_execution.rb +151 -0
- data/lib/roby/test/minitest_helpers.rb +166 -0
- data/lib/roby/test/roby_app_helpers.rb +200 -0
- data/lib/roby/test/run_planners.rb +155 -0
- data/lib/roby/test/self.rb +112 -0
- data/lib/roby/test/spec.rb +198 -0
- data/lib/roby/test/tasks/empty_task.rb +4 -4
- data/lib/roby/test/tasks/goto.rb +28 -27
- data/lib/roby/test/teardown_plans.rb +100 -0
- data/lib/roby/test/testcase.rb +239 -307
- data/lib/roby/test/tools.rb +159 -155
- data/lib/roby/test/validate_state_machine.rb +75 -0
- data/lib/roby/transaction.rb +1125 -0
- data/lib/roby/transaction/event_generator_proxy.rb +63 -0
- data/lib/roby/transaction/plan_object_proxy.rb +99 -0
- data/lib/roby/transaction/plan_service_proxy.rb +43 -0
- data/lib/roby/transaction/proxying.rb +120 -0
- data/lib/roby/transaction/task_event_generator_proxy.rb +19 -0
- data/lib/roby/transaction/task_proxy.rb +135 -0
- data/lib/roby/until_generator.rb +30 -0
- data/lib/roby/version.rb +5 -0
- data/lib/roby/yard.rb +169 -0
- data/lib/yard-roby.rb +1 -0
- data/manifest.xml +32 -6
- data/roby.gemspec +59 -0
- metadata +788 -587
- data/Manifest.txt +0 -321
- data/NOTES +0 -4
- data/README.txt +0 -166
- data/TODO.txt +0 -146
- data/app/README.txt +0 -24
- data/app/Rakefile +0 -8
- data/app/config/ROBOT.rb +0 -5
- data/app/config/init.rb +0 -33
- data/app/config/roby.yml +0 -3
- data/app/controllers/ROBOT.rb +0 -2
- data/app/planners/ROBOT/main.rb +0 -6
- data/app/planners/main.rb +0 -5
- data/app/scripts/distributed +0 -3
- data/app/scripts/generate/bookmarks +0 -3
- data/app/scripts/replay +0 -3
- data/app/scripts/results +0 -3
- data/app/scripts/run +0 -3
- data/app/scripts/server +0 -3
- data/app/scripts/shell +0 -3
- data/app/scripts/test +0 -3
- data/app/tasks/.gitattributes +0 -0
- data/app/tasks/ROBOT/.gitattributes +0 -0
- data/bin/roby-shell +0 -25
- data/doc/guide/src/basics/app.page +0 -139
- data/doc/guide/src/basics/index.page +0 -11
- data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
- data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
- data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
- data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
- data/doc/guide/src/basics/relations_display.page +0 -203
- data/doc/guide/src/basics/shell.page +0 -102
- data/doc/guide/src/default.css +0 -319
- data/doc/guide/src/introduction/index.page +0 -29
- data/doc/guide/src/introduction/publications.page +0 -14
- data/doc/guide/src/relations/dependency.page +0 -89
- data/doc/guide/src/relations/index.page +0 -12
- data/ext/droby/dump.cc +0 -175
- data/ext/droby/extconf.rb +0 -3
- data/ext/graph/algorithm.cc +0 -746
- data/ext/graph/extconf.rb +0 -7
- data/ext/graph/graph.cc +0 -575
- data/ext/graph/graph.hh +0 -183
- data/ext/graph/iterator_sequence.hh +0 -102
- data/ext/graph/undirected_dfs.hh +0 -226
- data/ext/graph/undirected_graph.hh +0 -421
- data/lib/roby/app/scripts/generate/bookmarks.rb +0 -162
- data/lib/roby/app/scripts/replay.rb +0 -31
- data/lib/roby/app/scripts/server.rb +0 -18
- data/lib/roby/basic_object.rb +0 -151
- data/lib/roby/config.rb +0 -14
- data/lib/roby/distributed.rb +0 -36
- data/lib/roby/distributed/base.rb +0 -448
- data/lib/roby/distributed/communication.rb +0 -875
- data/lib/roby/distributed/connection_space.rb +0 -616
- data/lib/roby/distributed/distributed_object.rb +0 -206
- data/lib/roby/distributed/drb.rb +0 -62
- data/lib/roby/distributed/notifications.rb +0 -531
- data/lib/roby/distributed/peer.rb +0 -555
- data/lib/roby/distributed/protocol.rb +0 -529
- data/lib/roby/distributed/proxy.rb +0 -343
- data/lib/roby/distributed/subscription.rb +0 -311
- data/lib/roby/distributed/transaction.rb +0 -498
- data/lib/roby/external_process_task.rb +0 -225
- data/lib/roby/graph.rb +0 -160
- data/lib/roby/log.rb +0 -3
- data/lib/roby/log/chronicle.rb +0 -303
- data/lib/roby/log/console.rb +0 -74
- data/lib/roby/log/data_stream.rb +0 -275
- data/lib/roby/log/dot.rb +0 -279
- data/lib/roby/log/event_stream.rb +0 -161
- data/lib/roby/log/file.rb +0 -396
- data/lib/roby/log/gui/basic_display.ui +0 -83
- data/lib/roby/log/gui/basic_display_ui.rb +0 -89
- data/lib/roby/log/gui/chronicle.rb +0 -26
- data/lib/roby/log/gui/chronicle_view.rb +0 -40
- data/lib/roby/log/gui/chronicle_view.ui +0 -70
- data/lib/roby/log/gui/chronicle_view_ui.rb +0 -90
- data/lib/roby/log/gui/data_displays.rb +0 -171
- data/lib/roby/log/gui/data_displays.ui +0 -155
- data/lib/roby/log/gui/data_displays_ui.rb +0 -146
- data/lib/roby/log/gui/notifications.rb +0 -26
- data/lib/roby/log/gui/relations.rb +0 -269
- data/lib/roby/log/gui/relations.ui +0 -123
- data/lib/roby/log/gui/relations_ui.rb +0 -120
- data/lib/roby/log/gui/relations_view.rb +0 -185
- data/lib/roby/log/gui/relations_view.ui +0 -149
- data/lib/roby/log/gui/relations_view_ui.rb +0 -144
- data/lib/roby/log/gui/replay.rb +0 -366
- data/lib/roby/log/gui/replay_controls.rb +0 -206
- data/lib/roby/log/gui/replay_controls.ui +0 -282
- data/lib/roby/log/gui/replay_controls_ui.rb +0 -249
- data/lib/roby/log/gui/runtime.rb +0 -130
- data/lib/roby/log/hooks.rb +0 -186
- data/lib/roby/log/logger.rb +0 -203
- data/lib/roby/log/notifications.rb +0 -244
- data/lib/roby/log/plan_rebuilder.rb +0 -468
- data/lib/roby/log/relations.rb +0 -1084
- data/lib/roby/log/server.rb +0 -547
- data/lib/roby/log/sqlite.rb +0 -47
- data/lib/roby/log/timings.rb +0 -233
- data/lib/roby/plan-object.rb +0 -371
- data/lib/roby/planning.rb +0 -13
- data/lib/roby/planning/loops.rb +0 -309
- data/lib/roby/planning/model.rb +0 -1012
- data/lib/roby/planning/task.rb +0 -180
- data/lib/roby/query.rb +0 -655
- data/lib/roby/relations/conflicts.rb +0 -67
- data/lib/roby/relations/dependency.rb +0 -358
- data/lib/roby/relations/ensured.rb +0 -19
- data/lib/roby/relations/error_handling.rb +0 -22
- data/lib/roby/relations/events.rb +0 -7
- data/lib/roby/relations/executed_by.rb +0 -208
- data/lib/roby/relations/influence.rb +0 -10
- data/lib/roby/relations/planned_by.rb +0 -63
- data/lib/roby/state/information.rb +0 -55
- data/lib/roby/state/state.rb +0 -367
- data/lib/roby/task-operations.rb +0 -186
- data/lib/roby/task_index.rb +0 -80
- data/lib/roby/test/distributed.rb +0 -230
- data/lib/roby/test/tasks/simple_task.rb +0 -23
- data/lib/roby/transactions.rb +0 -507
- data/lib/roby/transactions/proxy.rb +0 -325
- data/plugins/fault_injection/History.txt +0 -4
- data/plugins/fault_injection/README.txt +0 -34
- data/plugins/fault_injection/Rakefile +0 -12
- data/plugins/fault_injection/TODO.txt +0 -0
- data/plugins/fault_injection/app.rb +0 -52
- data/plugins/fault_injection/fault_injection.rb +0 -89
- data/plugins/fault_injection/test/test_fault_injection.rb +0 -78
- data/plugins/subsystems/README.txt +0 -37
- data/plugins/subsystems/Rakefile +0 -13
- data/plugins/subsystems/app.rb +0 -182
- data/plugins/subsystems/test/app/README +0 -24
- data/plugins/subsystems/test/app/Rakefile +0 -8
- data/plugins/subsystems/test/app/config/app.yml +0 -71
- data/plugins/subsystems/test/app/config/init.rb +0 -12
- data/plugins/subsystems/test/app/config/roby.yml +0 -3
- data/plugins/subsystems/test/app/planners/main.rb +0 -20
- data/plugins/subsystems/test/app/scripts/distributed +0 -3
- data/plugins/subsystems/test/app/scripts/replay +0 -3
- data/plugins/subsystems/test/app/scripts/results +0 -3
- data/plugins/subsystems/test/app/scripts/run +0 -3
- data/plugins/subsystems/test/app/scripts/server +0 -3
- data/plugins/subsystems/test/app/scripts/shell +0 -3
- data/plugins/subsystems/test/app/scripts/test +0 -3
- data/plugins/subsystems/test/app/tasks/services.rb +0 -15
- data/plugins/subsystems/test/test_subsystems.rb +0 -78
- data/test/distributed/test_communication.rb +0 -195
- data/test/distributed/test_connection.rb +0 -284
- data/test/distributed/test_execution.rb +0 -378
- data/test/distributed/test_mixed_plan.rb +0 -341
- data/test/distributed/test_plan_notifications.rb +0 -238
- data/test/distributed/test_protocol.rb +0 -525
- data/test/distributed/test_query.rb +0 -106
- data/test/distributed/test_remote_plan.rb +0 -491
- data/test/distributed/test_transaction.rb +0 -466
- data/test/mockups/external_process +0 -28
- data/test/mockups/tasks.rb +0 -27
- data/test/planning/test_loops.rb +0 -432
- data/test/planning/test_model.rb +0 -427
- data/test/planning/test_task.rb +0 -126
- data/test/relations/test_conflicts.rb +0 -42
- data/test/relations/test_dependency.rb +0 -324
- data/test/relations/test_ensured.rb +0 -38
- data/test/relations/test_executed_by.rb +0 -224
- data/test/relations/test_planned_by.rb +0 -56
- data/test/suite_core.rb +0 -29
- data/test/suite_distributed.rb +0 -10
- data/test/suite_planning.rb +0 -4
- data/test/suite_relations.rb +0 -8
- data/test/tasks/test_external_process.rb +0 -126
- data/test/tasks/test_thread_task.rb +0 -70
- data/test/test_bgl.rb +0 -528
- data/test/test_event.rb +0 -969
- data/test/test_exceptions.rb +0 -591
- data/test/test_execution_engine.rb +0 -987
- data/test/test_gui.rb +0 -20
- data/test/test_interface.rb +0 -43
- data/test/test_log.rb +0 -125
- data/test/test_log_server.rb +0 -133
- data/test/test_plan.rb +0 -418
- data/test/test_query.rb +0 -424
- data/test/test_relations.rb +0 -260
- data/test/test_state.rb +0 -432
- data/test/test_support.rb +0 -16
- data/test/test_task.rb +0 -1181
- data/test/test_testcase.rb +0 -138
- data/test/test_transactions.rb +0 -610
- data/test/test_transactions_proxy.rb +0 -216
data/lib/roby/log/sqlite.rb
DELETED
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
require 'roby/log'
|
|
2
|
-
require 'roby/distributed'
|
|
3
|
-
require 'sqlite3'
|
|
4
|
-
require 'stringio'
|
|
5
|
-
|
|
6
|
-
module Roby::Log
|
|
7
|
-
class SQLiteLogger
|
|
8
|
-
attr_reader :db, :insert
|
|
9
|
-
def initialize(filename)
|
|
10
|
-
@db = SQLite3::Database.new(filename)
|
|
11
|
-
db.execute("DROP TABLE IF EXISTS events")
|
|
12
|
-
db.execute("CREATE TABLE events (
|
|
13
|
-
method TEXT,
|
|
14
|
-
sec INTEGER,
|
|
15
|
-
usec INTEGER,
|
|
16
|
-
args BLOB)")
|
|
17
|
-
@insert = db.prepare("insert into events values (?, ?, ?, ?)")
|
|
18
|
-
end
|
|
19
|
-
def splat?; false end
|
|
20
|
-
|
|
21
|
-
Roby::Log.each_hook do |klass, m|
|
|
22
|
-
define_method(m) do |args|
|
|
23
|
-
begin
|
|
24
|
-
time = args[0]
|
|
25
|
-
args = SQLite3::Blob.new Roby::Distributed.dump(args[1..-1])
|
|
26
|
-
insert.execute(m.to_s, time.tv_sec, time.tv_usec, args)
|
|
27
|
-
rescue
|
|
28
|
-
STDERR.puts "failed to dump #{m}#{args}: #{$!.full_message}"
|
|
29
|
-
end
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def self.replay(filename)
|
|
34
|
-
db = SQLite3::Database.new(filename)
|
|
35
|
-
method_name = nil
|
|
36
|
-
db.execute("select * from events") do |method_name, sec, usec, args|
|
|
37
|
-
time = Time.at(Integer(sec), Integer(usec))
|
|
38
|
-
args = Marshal.load(StringIO.new(args))
|
|
39
|
-
args.unshift time
|
|
40
|
-
yield(method_name.to_sym, args)
|
|
41
|
-
end
|
|
42
|
-
rescue
|
|
43
|
-
STDERR.puts "ignoring call to #{method_name}: #{$!.full_message}"
|
|
44
|
-
end
|
|
45
|
-
end
|
|
46
|
-
end
|
|
47
|
-
|
data/lib/roby/log/timings.rb
DELETED
|
@@ -1,233 +0,0 @@
|
|
|
1
|
-
require 'set'
|
|
2
|
-
|
|
3
|
-
module Roby
|
|
4
|
-
module Log
|
|
5
|
-
class Timings
|
|
6
|
-
REF_TIMING = :start
|
|
7
|
-
ALL_TIMINGS = [ :real_start, :events,
|
|
8
|
-
:structure_check, :exception_propagation,
|
|
9
|
-
:exceptions_fatal, :garbage_collect,
|
|
10
|
-
:ruby_gc, :expected_sleep, :sleep, :end ]
|
|
11
|
-
|
|
12
|
-
ALL_NUMERIC_FIELDS = [:cycle_index, :live_objects, :object_allocation, :heap_slots,
|
|
13
|
-
:log_queue_size, :plan_task_count, :plan_event_count, :cpu_time]
|
|
14
|
-
|
|
15
|
-
ALL_FIELDS = ALL_TIMINGS + ALL_NUMERIC_FIELDS + [:event_count, :pos]
|
|
16
|
-
|
|
17
|
-
attr_reader :logfile
|
|
18
|
-
attr_reader :ignored_timings
|
|
19
|
-
def initialize(logfile)
|
|
20
|
-
@logfile = logfile
|
|
21
|
-
@ignored_timings = Set.new
|
|
22
|
-
rewind
|
|
23
|
-
end
|
|
24
|
-
def rewind; logfile.rewind end
|
|
25
|
-
|
|
26
|
-
# Read the logfile index, extract statistic information from it and
|
|
27
|
-
# yield them cycle-by-cycle. The format of +timings+ is the
|
|
28
|
-
# following:
|
|
29
|
-
#
|
|
30
|
-
# [start, real_start, events,
|
|
31
|
-
# structure_check, exception_propagation,
|
|
32
|
-
# exceptions_fatal, garbage_collect,
|
|
33
|
-
# ruby_gc, expected_sleep, sleep, end]
|
|
34
|
-
#
|
|
35
|
-
# where +start+ is the target start time of the cycle as a Time
|
|
36
|
-
# object. The rest of the values are floating-point values which
|
|
37
|
-
# represent offset from +start+ if +cumulative+ is true or offset
|
|
38
|
-
# from the previous one if +cumulative+ is false. Therefore, in the
|
|
39
|
-
# latter case, the values represent the actual duration of each
|
|
40
|
-
# phase in the execution engine.
|
|
41
|
-
#
|
|
42
|
-
# The phases are as follows:
|
|
43
|
-
# real_start::
|
|
44
|
-
# the actual starting time. It allows to see the offset due (for
|
|
45
|
-
# instance) to the uncertainty in sleep
|
|
46
|
-
# events::
|
|
47
|
-
# event propagation phase, including the propagation of dRoby
|
|
48
|
-
# events (events coming from remote hosts)
|
|
49
|
-
# structure_check::
|
|
50
|
-
# first structure checking pass
|
|
51
|
-
# exception_propagation::
|
|
52
|
-
# exception propagation phase
|
|
53
|
-
# exceptions_fatal::
|
|
54
|
-
# second structure checking pass, and propagation of the fatal
|
|
55
|
-
# errors (i.e. killing the involved tasks)
|
|
56
|
-
# garbage_collect::
|
|
57
|
-
# Roby's garbage collection pass
|
|
58
|
-
# ruby_gc::
|
|
59
|
-
# if GC.enable accepts a true/false argument, Roby will
|
|
60
|
-
# explicitely allow the GC to run only at a specific point, and
|
|
61
|
-
# monitor its execution time. This is the result. Note that Roby
|
|
62
|
-
# issues a warning at startup if it is not the case.
|
|
63
|
-
# expected_sleep::
|
|
64
|
-
# how much time Roby wanted to sleep (i.e. how many milliseconds
|
|
65
|
-
# were given to the sleep() call)
|
|
66
|
-
# sleep::
|
|
67
|
-
# how much time Roby actually slept
|
|
68
|
-
# end::
|
|
69
|
-
# end of the cycle
|
|
70
|
-
#
|
|
71
|
-
# The second array that is yield, +numeric+, contains non-timing
|
|
72
|
-
# statistics. Its format is:
|
|
73
|
-
#
|
|
74
|
-
# [cycle_index, live_objects, object_allocation, log_queue_size,
|
|
75
|
-
# plan_task_count, plan_event_count, cpu_time]
|
|
76
|
-
#
|
|
77
|
-
# where
|
|
78
|
-
#
|
|
79
|
-
# cycle_index::
|
|
80
|
-
# The index of this cycle. Note that some number can be missing: if one
|
|
81
|
-
# cycle takes more than two time its allocated period, then +cycle_index+ is
|
|
82
|
-
# updated to reflect the cycles that have been missed.
|
|
83
|
-
# live_objects::
|
|
84
|
-
# The count of allocated objects at the end of the cycle. It is only valid
|
|
85
|
-
# on Ruby interpreters that have been patched to report this value
|
|
86
|
-
# efficiently.
|
|
87
|
-
# object_allocation::
|
|
88
|
-
# How many objects have been allocated during this cycle. This is valid only
|
|
89
|
-
# if Ruby GC is controlled by Roby (see the description of +ruby_gc+ above).
|
|
90
|
-
# Otherwise, it will be invalid in cycles where the Ruby GC ran, as the
|
|
91
|
-
# statistics can't correct the objects freed by Ruby's GC.
|
|
92
|
-
# log_queue_size::
|
|
93
|
-
# The logger runs in a thread separated from the execution engine, and a
|
|
94
|
-
# fixed-size queue is used to communicate between the threads. This value is
|
|
95
|
-
# the size of the queue at the end of the cycle (after sleep()). It is
|
|
96
|
-
# mainly used for debugging purposes: if this queue is almost full, then the
|
|
97
|
-
# execution engine thread will probably be interrupted to let the log thread
|
|
98
|
-
# empty the queue.
|
|
99
|
-
# plan_task_count::
|
|
100
|
-
# The count of tasks in the plan at the end of the cycle.
|
|
101
|
-
# plan_event_count::
|
|
102
|
-
# The count of free events in the plan at the end of the cycle.
|
|
103
|
-
# cpu_time::
|
|
104
|
-
# The CPU time taken by the Roby controller for this cycle.
|
|
105
|
-
def each_cycle(cumulative = false) # :yield:numeric, timings
|
|
106
|
-
last_deltas = Hash.new
|
|
107
|
-
for data in logfile.index_data[1..-1]
|
|
108
|
-
result = []
|
|
109
|
-
timings = data
|
|
110
|
-
ref = Time.at(*timings.delete(REF_TIMING))
|
|
111
|
-
result << ref
|
|
112
|
-
|
|
113
|
-
unknown_timings = (timings.keys.to_set - ALL_FIELDS.to_set - ignored_timings)
|
|
114
|
-
if !unknown_timings.empty?
|
|
115
|
-
STDERR.puts "ignoring the following timings: #{unknown_timings.to_a.join(", ")}"
|
|
116
|
-
@ignored_timings |= unknown_timings
|
|
117
|
-
end
|
|
118
|
-
timings = ALL_TIMINGS.map do |name|
|
|
119
|
-
timings[name]
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
if cumulative
|
|
123
|
-
timings.inject(0) do |last, time|
|
|
124
|
-
time ||= last
|
|
125
|
-
result << time
|
|
126
|
-
time
|
|
127
|
-
end
|
|
128
|
-
else
|
|
129
|
-
timings.inject(0) do |last, time|
|
|
130
|
-
time ||= last
|
|
131
|
-
result << time - last
|
|
132
|
-
time
|
|
133
|
-
end
|
|
134
|
-
end
|
|
135
|
-
|
|
136
|
-
numeric = data.values_at(*ALL_NUMERIC_FIELDS)
|
|
137
|
-
yield(numeric, result)
|
|
138
|
-
end
|
|
139
|
-
|
|
140
|
-
rescue ArgumentError => e
|
|
141
|
-
if e.message =~ /marshal data too short/
|
|
142
|
-
STDERR.puts "File truncated"
|
|
143
|
-
else raise
|
|
144
|
-
end
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
def timeval_to_s(t)
|
|
148
|
-
'%02i:%02i:%02i.%03i' % [t.tv_sec / 3600, t.tv_sec % 3600 / 60, t.tv_sec % 60, t.tv_usec / 1000]
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
def stats
|
|
152
|
-
last_start = nil
|
|
153
|
-
mean, max, stdev = nil
|
|
154
|
-
count = 0
|
|
155
|
-
|
|
156
|
-
mean_cycle = 0
|
|
157
|
-
stdev_cycle = 0
|
|
158
|
-
max_cycle = nil
|
|
159
|
-
|
|
160
|
-
# Compute mean value
|
|
161
|
-
each_cycle(false) do |numeric, timings|
|
|
162
|
-
if !mean
|
|
163
|
-
mean = Array.new(numeric.size + timings.size, 0.0)
|
|
164
|
-
max = Array.new
|
|
165
|
-
end
|
|
166
|
-
|
|
167
|
-
# Compute mean value
|
|
168
|
-
start = timings.shift + timings.first
|
|
169
|
-
if last_start
|
|
170
|
-
cycle_length = start - last_start
|
|
171
|
-
if !max_cycle || max_cycle < cycle_length
|
|
172
|
-
max_cycle = cycle_length
|
|
173
|
-
end
|
|
174
|
-
mean_cycle += cycle_length
|
|
175
|
-
end
|
|
176
|
-
last_start = start
|
|
177
|
-
|
|
178
|
-
(numeric + timings).each_with_index do |v, i|
|
|
179
|
-
mean[i] += v if v
|
|
180
|
-
max[i] = v if v && (!max[i] || max[i] < v)
|
|
181
|
-
end
|
|
182
|
-
count += 1
|
|
183
|
-
end
|
|
184
|
-
mean.map! { |v| v / count }
|
|
185
|
-
mean_cycle /= count
|
|
186
|
-
|
|
187
|
-
last_start = nil
|
|
188
|
-
rewind
|
|
189
|
-
stdev = Array.new(mean.size, 0.0)
|
|
190
|
-
each_cycle(false) do |numeric, timings|
|
|
191
|
-
start = timings.shift + timings.first
|
|
192
|
-
if last_start
|
|
193
|
-
stdev_cycle += (start - last_start - mean_cycle)**2
|
|
194
|
-
end
|
|
195
|
-
last_start = start
|
|
196
|
-
|
|
197
|
-
(numeric + timings).each_with_index { |v, i| stdev[i] += (v - mean[i]) ** 2 if v }
|
|
198
|
-
end
|
|
199
|
-
stdev.map! { |v| Math.sqrt(v / count) if v }
|
|
200
|
-
|
|
201
|
-
format = "%-28s %-10.2f %-10.2f %-10.2f"
|
|
202
|
-
|
|
203
|
-
puts "\n" + "Per-cycle statistics".center(50)
|
|
204
|
-
puts "%-28s %-10s %-10s %-10s" % ['', 'mean', 'stddev', 'max']
|
|
205
|
-
puts format % ["cycle", mean_cycle * 1000, Math.sqrt(stdev_cycle / count) * 1000, max_cycle * 1000]
|
|
206
|
-
ALL_NUMERIC_FIELDS.each_with_index do |name, i|
|
|
207
|
-
puts format % [name, mean[i], stdev[i], (max[i] || 0)] unless name == :cycle_index
|
|
208
|
-
end
|
|
209
|
-
|
|
210
|
-
puts "\n" + "Broken down cycle timings".center(50)
|
|
211
|
-
puts "%-28s %-10s %-10s %-10s" % ['', 'mean', 'stddev', 'max']
|
|
212
|
-
(ALL_TIMINGS).each_with_index do |name, i|
|
|
213
|
-
i += ALL_NUMERIC_FIELDS.size
|
|
214
|
-
puts format % [name, mean[i] * 1000, stdev[i] * 1000, max[i] * 1000]
|
|
215
|
-
end
|
|
216
|
-
end
|
|
217
|
-
|
|
218
|
-
def display(cumulative)
|
|
219
|
-
header = ([REF_TIMING] + ALL_TIMINGS + ALL_NUMERIC_FIELDS).enum_for(:each_with_index).
|
|
220
|
-
map { |n, i| "#{i + 1}_#{n}" }.
|
|
221
|
-
join("\t")
|
|
222
|
-
|
|
223
|
-
puts header
|
|
224
|
-
each_cycle(cumulative) do |numeric, results|
|
|
225
|
-
print "#{timeval_to_s(results.shift)} "
|
|
226
|
-
print results.join(" ")
|
|
227
|
-
print " "
|
|
228
|
-
puts numeric.join(" ")
|
|
229
|
-
end
|
|
230
|
-
end
|
|
231
|
-
end
|
|
232
|
-
end
|
|
233
|
-
end
|
data/lib/roby/plan-object.rb
DELETED
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
module Roby
|
|
2
|
-
# Base class for all objects which are included in a plan.
|
|
3
|
-
class PlanObject < BasicObject
|
|
4
|
-
include DirectedRelationSupport
|
|
5
|
-
|
|
6
|
-
# The plan this object belongs to
|
|
7
|
-
attr_reader :plan
|
|
8
|
-
|
|
9
|
-
# The engine which acts on +plan+ (if there is one)
|
|
10
|
-
def engine; plan.engine end
|
|
11
|
-
|
|
12
|
-
# The place where this object has been removed from its plan. Once an
|
|
13
|
-
# object is removed from its plan, it cannot be added back again.
|
|
14
|
-
attr_accessor :removed_at
|
|
15
|
-
|
|
16
|
-
# True if this object has been included in a plan, but has been removed
|
|
17
|
-
# from it since
|
|
18
|
-
def finalized?; !!removed_at end
|
|
19
|
-
|
|
20
|
-
# Sets the new plan. Since it is forbidden to re-use a plan object that
|
|
21
|
-
# has been removed from a plan, it raises ArgumentError if it is the
|
|
22
|
-
# case
|
|
23
|
-
def plan=(new_plan)
|
|
24
|
-
if removed_at
|
|
25
|
-
raise ArgumentError, "#{self} has been removed from plan, cannot add it back\n" +
|
|
26
|
-
"Removed at\n #{removed_at.join("\n ")}"
|
|
27
|
-
end
|
|
28
|
-
@plan = new_plan
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
# The propagation engine object for this. For PlanObject instances, it
|
|
32
|
-
# is always the plan itself.
|
|
33
|
-
def propagation_engine
|
|
34
|
-
plan
|
|
35
|
-
end
|
|
36
|
-
|
|
37
|
-
# If +self+ is a transaction proxy, returns the underlying plan object,
|
|
38
|
-
# regardless of how many transactions there is on the stack. Otherwise,
|
|
39
|
-
# return self.
|
|
40
|
-
def real_object
|
|
41
|
-
result = self
|
|
42
|
-
while result.respond_to?(:__getobj__)
|
|
43
|
-
result = result.__getobj__
|
|
44
|
-
end
|
|
45
|
-
result
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
# Returns the stack of transactions/plans this object is part of,
|
|
49
|
-
# starting with self.plan.
|
|
50
|
-
def transaction_stack
|
|
51
|
-
result = [plan]
|
|
52
|
-
obj = self
|
|
53
|
-
while obj.respond_to?(:__getobj__)
|
|
54
|
-
obj = obj.__getobj__
|
|
55
|
-
result << obj.plan
|
|
56
|
-
end
|
|
57
|
-
result
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
# call-seq:
|
|
61
|
-
# merged_relation(:each_child_object, false, Dependency) do |parent, child|
|
|
62
|
-
# end
|
|
63
|
-
# merged_relation(:each_child_object, true, Dependency) do |child|
|
|
64
|
-
# end
|
|
65
|
-
#
|
|
66
|
-
# Behaves like +enumerator+, but merges all the changes that underlying
|
|
67
|
-
# transactions may have applied. I.e. it is equivalent to applying
|
|
68
|
-
# +enumerator+ on the plan that would be the result of the application
|
|
69
|
-
# of the whole transaction stack
|
|
70
|
-
#
|
|
71
|
-
# If +instrusive+ is false, the edges are yielded at the level they
|
|
72
|
-
# appear. I.e. both the parent and the child are given, and [parent,
|
|
73
|
-
# child] may be part of a parent plan of self.plan.
|
|
74
|
-
#
|
|
75
|
-
# If +instrusive+ is true, the related objects are recursively added to
|
|
76
|
-
# all transactions in the transaction stack, and are given at the end.
|
|
77
|
-
# I.e. only the related object is yield, and it is guaranteed to be
|
|
78
|
-
# included in self.plan.
|
|
79
|
-
def merged_relations(enumerator, intrusive, *args, &block)
|
|
80
|
-
if !block_given?
|
|
81
|
-
return enum_for(:merged_relations, enumerator, intrusive, *args)
|
|
82
|
-
end
|
|
83
|
-
|
|
84
|
-
plan_chain = self.transaction_stack
|
|
85
|
-
object = self.real_object
|
|
86
|
-
|
|
87
|
-
pending = Array.new
|
|
88
|
-
while plan_chain.size > 1
|
|
89
|
-
plan = plan_chain.pop
|
|
90
|
-
next_plan = plan_chain.last
|
|
91
|
-
|
|
92
|
-
# Objects that are in +plan+ but not in +next_plan+ are
|
|
93
|
-
# automatically added, as +next_plan+ is not able to change
|
|
94
|
-
# them. Those that are included in +next_plan+ are handled
|
|
95
|
-
# later.
|
|
96
|
-
new_objects = Array.new
|
|
97
|
-
object.send(enumerator, *args) do |related_object, _|
|
|
98
|
-
next if next_plan[related_object, false]
|
|
99
|
-
|
|
100
|
-
if !intrusive
|
|
101
|
-
yield(object, related_object)
|
|
102
|
-
else
|
|
103
|
-
new_objects << related_object
|
|
104
|
-
end
|
|
105
|
-
end
|
|
106
|
-
|
|
107
|
-
# Here, pending contains objects from the previous plan (i.e. in
|
|
108
|
-
# plan.plan). Proxy them in +plan+.
|
|
109
|
-
#
|
|
110
|
-
# It is important to do that *after* we enumerated the relations
|
|
111
|
-
# that exist in +plan+ (above), as it reduces the number of
|
|
112
|
-
# relations at each level.
|
|
113
|
-
pending.map! { |t| plan[t] }
|
|
114
|
-
# And add the new objects that we just discovered
|
|
115
|
-
pending.concat(new_objects)
|
|
116
|
-
|
|
117
|
-
if next_plan
|
|
118
|
-
object = next_plan[object]
|
|
119
|
-
end
|
|
120
|
-
end
|
|
121
|
-
|
|
122
|
-
if intrusive
|
|
123
|
-
send(enumerator, *args, &block)
|
|
124
|
-
for related_object in pending
|
|
125
|
-
yield(self.plan[related_object])
|
|
126
|
-
end
|
|
127
|
-
else
|
|
128
|
-
send(enumerator, *args) do |related_object, _|
|
|
129
|
-
yield(self, related_object)
|
|
130
|
-
end
|
|
131
|
-
end
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
# A three-state flag with the following values:
|
|
135
|
-
# nil:: the object is executable if its plan is
|
|
136
|
-
# true:: the object is executable
|
|
137
|
-
# false:: the object is not executable
|
|
138
|
-
attr_writer :executable
|
|
139
|
-
|
|
140
|
-
# If this object is executable
|
|
141
|
-
def executable?
|
|
142
|
-
@executable || (@executable.nil? && plan && plan.executable?)
|
|
143
|
-
end
|
|
144
|
-
|
|
145
|
-
# True if we are explicitely subscribed to this object
|
|
146
|
-
def subscribed?
|
|
147
|
-
if root_object?
|
|
148
|
-
(plan && plan.subscribed?) ||
|
|
149
|
-
(!self_owned? && owners.any? { |peer| peer.subscribed_plan? }) ||
|
|
150
|
-
super
|
|
151
|
-
else
|
|
152
|
-
root_object.subscribed?
|
|
153
|
-
end
|
|
154
|
-
end
|
|
155
|
-
|
|
156
|
-
# True if we should send updates about this object to +peer+
|
|
157
|
-
def update_on?(peer); (plan && plan.update_on?(peer)) || super end
|
|
158
|
-
# True if we receive updates for this object from +peer+
|
|
159
|
-
def updated_by?(peer); (plan && plan.updated_by?(peer)) || super end
|
|
160
|
-
# True if this object is useful for one of our peers
|
|
161
|
-
def remotely_useful?; (plan && plan.remotely_useful?) || super end
|
|
162
|
-
|
|
163
|
-
# Checks that we do not link two objects from two different plans and
|
|
164
|
-
# updates the +plan+ attribute accordingly
|
|
165
|
-
#
|
|
166
|
-
# It raises RuntimeError if both objects are already included in a
|
|
167
|
-
# plan, but their plan mismatches.
|
|
168
|
-
def synchronize_plan(other) # :nodoc:
|
|
169
|
-
if plan == other.plan
|
|
170
|
-
elsif other.plan && plan
|
|
171
|
-
raise RuntimeError, "cannot add a relation between two objects from different plans. #{self} is from #{plan} and #{other} is from #{other.plan}"
|
|
172
|
-
elsif plan
|
|
173
|
-
self.plan.add(other)
|
|
174
|
-
elsif other.plan
|
|
175
|
-
other.plan.add(self)
|
|
176
|
-
end
|
|
177
|
-
end
|
|
178
|
-
protected :synchronize_plan
|
|
179
|
-
|
|
180
|
-
# Called when all links to +peer+ should be removed.
|
|
181
|
-
def forget_peer(peer)
|
|
182
|
-
if !root_object?
|
|
183
|
-
raise ArgumentError, "#{self} is not root"
|
|
184
|
-
end
|
|
185
|
-
|
|
186
|
-
each_plan_child do |child|
|
|
187
|
-
child.forget_peer(peer)
|
|
188
|
-
end
|
|
189
|
-
super
|
|
190
|
-
end
|
|
191
|
-
|
|
192
|
-
# Synchronizes the plan of this object from the one of its peer
|
|
193
|
-
def add_child_object(child, type, info = nil) # :nodoc:
|
|
194
|
-
if child.plan != plan
|
|
195
|
-
root_object.synchronize_plan(child.root_object)
|
|
196
|
-
end
|
|
197
|
-
|
|
198
|
-
super
|
|
199
|
-
end
|
|
200
|
-
|
|
201
|
-
# Return the root plan object for this object.
|
|
202
|
-
def root_object; self end
|
|
203
|
-
# True if this object is a root object in the plan.
|
|
204
|
-
def root_object?; root_object == self end
|
|
205
|
-
# Iterates on all the children of this root object
|
|
206
|
-
def each_plan_child; self end
|
|
207
|
-
|
|
208
|
-
# This class method sets up the enclosing class as a child object,
|
|
209
|
-
# with the root object being returned by the given attribute.
|
|
210
|
-
# Task event generators are for instance defined by
|
|
211
|
-
#
|
|
212
|
-
# class TaskEventGenerator < EventGenerator
|
|
213
|
-
# # The task this generator belongs to
|
|
214
|
-
# attr_reader :task
|
|
215
|
-
#
|
|
216
|
-
# child_plan_object :task
|
|
217
|
-
# end
|
|
218
|
-
def self.child_plan_object(attribute)
|
|
219
|
-
class_eval <<-EOD
|
|
220
|
-
def root_object; #{attribute} end
|
|
221
|
-
def root_object?; false end
|
|
222
|
-
def owners; #{attribute}.owners end
|
|
223
|
-
def distribute?; #{attribute}.distribute? end
|
|
224
|
-
def plan; #{attribute}.plan end
|
|
225
|
-
def executable?; #{attribute}.executable? end
|
|
226
|
-
|
|
227
|
-
def subscribed?; #{attribute}.subscribed? end
|
|
228
|
-
def updated?; #{attribute}.updated? end
|
|
229
|
-
def updated_by?(peer); #{attribute}.updated_by?(peer) end
|
|
230
|
-
def update_on?(peer); #{attribute}.update_on?(peer) end
|
|
231
|
-
def updated_peers; #{attribute}.updated_peers end
|
|
232
|
-
def remotely_useful?; #{attribute}.remotely_useful? end
|
|
233
|
-
|
|
234
|
-
def forget_peer(peer)
|
|
235
|
-
remove_sibling_for(peer)
|
|
236
|
-
end
|
|
237
|
-
def sibling_of(remote_object, peer)
|
|
238
|
-
if !distribute?
|
|
239
|
-
raise ArgumentError, "#{self} is local only"
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
add_sibling_for(peer, remote_object)
|
|
243
|
-
end
|
|
244
|
-
|
|
245
|
-
private :plan=
|
|
246
|
-
private :executable=
|
|
247
|
-
EOD
|
|
248
|
-
end
|
|
249
|
-
|
|
250
|
-
# Transfers a set of relations from this plan object to +object+.
|
|
251
|
-
# +changes+ is formatted as a sequence of <tt>relation, parents,
|
|
252
|
-
# children</tt> slices, where +parents+ and +children+ are sets of
|
|
253
|
-
# objects.
|
|
254
|
-
#
|
|
255
|
-
# For each of these slices, the method removes the
|
|
256
|
-
# <tt>parent->self</tt> and <tt>self->child</tt> edges in the given
|
|
257
|
-
# relation, and then adds the corresponding <tt>parent->object</tt> and
|
|
258
|
-
# <tt>object->child</tt> edges.
|
|
259
|
-
def apply_relation_changes(object, changes)
|
|
260
|
-
# The operation is done in two parts to avoid problems with
|
|
261
|
-
# creating cycles in the graph: first we remove the old edges, then
|
|
262
|
-
# we add the new ones.
|
|
263
|
-
changes.each_slice(3) do |rel, parents, children|
|
|
264
|
-
parents.each_slice(2) do |parent, info|
|
|
265
|
-
parent.remove_child_object(self, rel)
|
|
266
|
-
end
|
|
267
|
-
children.each_slice(2) do |child, info|
|
|
268
|
-
remove_child_object(child, rel)
|
|
269
|
-
end
|
|
270
|
-
end
|
|
271
|
-
|
|
272
|
-
changes.each_slice(3) do |rel, parents, children|
|
|
273
|
-
parents.each_slice(2) do |parent, info|
|
|
274
|
-
parent.add_child_object(object, rel, info)
|
|
275
|
-
end
|
|
276
|
-
children.each_slice(2) do |child, info|
|
|
277
|
-
object.add_child_object(child, rel, info)
|
|
278
|
-
end
|
|
279
|
-
end
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
# Replaces, in the plan, the subplan generated by this plan object by
|
|
283
|
-
# the one generated by +object+. In practice, it means that we transfer
|
|
284
|
-
# all parent edges whose target is +self+ from the receiver to
|
|
285
|
-
# +object+. It calls the various add/remove hooks defined in
|
|
286
|
-
# DirectedRelationSupport.
|
|
287
|
-
def replace_subplan_by(object)
|
|
288
|
-
changes = []
|
|
289
|
-
each_relation do |rel|
|
|
290
|
-
parents = []
|
|
291
|
-
each_parent_object(rel) do |parent|
|
|
292
|
-
unless parent.root_object == root_object
|
|
293
|
-
parents << parent << parent[self, rel]
|
|
294
|
-
end
|
|
295
|
-
end
|
|
296
|
-
changes << rel << parents << []
|
|
297
|
-
end
|
|
298
|
-
|
|
299
|
-
apply_relation_changes(object, changes)
|
|
300
|
-
end
|
|
301
|
-
|
|
302
|
-
# Replaces +self+ by +object+ in all graphs +self+ is part of. Unlike
|
|
303
|
-
# BGL::Vertex#replace_by, this calls the various add/remove hooks
|
|
304
|
-
# defined in DirectedRelationSupport
|
|
305
|
-
def replace_by(object)
|
|
306
|
-
changes = []
|
|
307
|
-
each_relation do |rel|
|
|
308
|
-
parents = []
|
|
309
|
-
each_parent_object(rel) do |parent|
|
|
310
|
-
unless parent.root_object == root_object
|
|
311
|
-
parents << parent << parent[self, rel]
|
|
312
|
-
end
|
|
313
|
-
end
|
|
314
|
-
children = []
|
|
315
|
-
each_child_object(rel) do |child|
|
|
316
|
-
unless child.root_object == root_object
|
|
317
|
-
children << child << self[child, rel]
|
|
318
|
-
end
|
|
319
|
-
end
|
|
320
|
-
changes << rel << parents << children
|
|
321
|
-
end
|
|
322
|
-
|
|
323
|
-
apply_relation_changes(object, changes)
|
|
324
|
-
end
|
|
325
|
-
|
|
326
|
-
# True if this object can be modified by the local plan manager
|
|
327
|
-
def read_write?
|
|
328
|
-
if (owners.include?(Distributed) || Distributed.updating?(root_object) || !plan)
|
|
329
|
-
true
|
|
330
|
-
elsif plan.owners.include?(Distributed)
|
|
331
|
-
for peer in owners
|
|
332
|
-
return false unless plan.owners.include?(peer)
|
|
333
|
-
end
|
|
334
|
-
true
|
|
335
|
-
end
|
|
336
|
-
end
|
|
337
|
-
|
|
338
|
-
# Hook called when a new child is added to this object in the given
|
|
339
|
-
# relations and with the given information object.
|
|
340
|
-
def adding_child_object(child, relations, info)
|
|
341
|
-
super if defined? super
|
|
342
|
-
return if !plan
|
|
343
|
-
|
|
344
|
-
for trsc in plan.transactions
|
|
345
|
-
next unless trsc.proxying?
|
|
346
|
-
if (parent_proxy = trsc[self, false]) && (child_proxy = trsc[child, false])
|
|
347
|
-
trsc.adding_plan_relation(parent_proxy, child_proxy, relations, info)
|
|
348
|
-
end
|
|
349
|
-
end
|
|
350
|
-
end
|
|
351
|
-
|
|
352
|
-
# Hook called when a child of this object is being removed from the
|
|
353
|
-
# given relations.
|
|
354
|
-
def removing_child_object(child, relations)
|
|
355
|
-
unless read_write? || child.read_write?
|
|
356
|
-
raise OwnershipError, "cannot remove a relation between two objects we don't own"
|
|
357
|
-
end
|
|
358
|
-
|
|
359
|
-
super if defined? super
|
|
360
|
-
return if !plan
|
|
361
|
-
|
|
362
|
-
for trsc in plan.transactions
|
|
363
|
-
next unless trsc.proxying?
|
|
364
|
-
if (parent_proxy = trsc[self, false]) && (child_proxy = trsc[child, false])
|
|
365
|
-
trsc.removing_plan_relation(parent_proxy, child_proxy, relations)
|
|
366
|
-
end
|
|
367
|
-
end
|
|
368
|
-
end
|
|
369
|
-
end
|
|
370
|
-
end
|
|
371
|
-
|