roby 0.7.3 → 0.8.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 (236) hide show
  1. data/History.txt +7 -5
  2. data/Manifest.txt +91 -16
  3. data/README.txt +24 -24
  4. data/Rakefile +92 -64
  5. data/app/config/app.yml +42 -43
  6. data/app/config/init.rb +26 -0
  7. data/benchmark/alloc_misc.rb +123 -0
  8. data/benchmark/discovery_latency.rb +67 -0
  9. data/benchmark/garbage_collection.rb +48 -0
  10. data/benchmark/genom.rb +31 -0
  11. data/benchmark/transactions.rb +62 -0
  12. data/bin/roby +1 -1
  13. data/bin/roby-log +16 -6
  14. data/doc/guide/.gitignore +2 -0
  15. data/doc/guide/config.yaml +34 -0
  16. data/doc/guide/ext/init.rb +14 -0
  17. data/doc/guide/ext/previous_next.rb +40 -0
  18. data/doc/guide/ext/rdoc_links.rb +33 -0
  19. data/doc/guide/index.rdoc +16 -0
  20. data/doc/guide/overview.rdoc +62 -0
  21. data/doc/guide/plan_modifications.rdoc +67 -0
  22. data/doc/guide/src/abstraction/achieve_with.page +8 -0
  23. data/doc/guide/src/abstraction/forwarding.page +8 -0
  24. data/doc/guide/src/abstraction/hierarchy.page +19 -0
  25. data/doc/guide/src/abstraction/index.page +28 -0
  26. data/doc/guide/src/abstraction/task_models.page +13 -0
  27. data/doc/guide/src/basics.template +6 -0
  28. data/doc/guide/src/basics/app.page +139 -0
  29. data/doc/guide/src/basics/code_examples.page +33 -0
  30. data/doc/guide/src/basics/dry.page +69 -0
  31. data/doc/guide/src/basics/errors.page +443 -0
  32. data/doc/guide/src/basics/events.page +179 -0
  33. data/doc/guide/src/basics/hierarchy.page +275 -0
  34. data/doc/guide/src/basics/index.page +11 -0
  35. data/doc/guide/src/basics/log_replay/goForward_1.png +0 -0
  36. data/doc/guide/src/basics/log_replay/goForward_2.png +0 -0
  37. data/doc/guide/src/basics/log_replay/goForward_3.png +0 -0
  38. data/doc/guide/src/basics/log_replay/goForward_4.png +0 -0
  39. data/doc/guide/src/basics/log_replay/goForward_5.png +0 -0
  40. data/doc/guide/src/basics/log_replay/hierarchy_error_1.png +0 -0
  41. data/doc/guide/src/basics/log_replay/hierarchy_error_2.png +0 -0
  42. data/doc/guide/src/basics/log_replay/hierarchy_error_3.png +0 -0
  43. data/doc/guide/src/basics/log_replay/plan_repair_1.png +0 -0
  44. data/doc/guide/src/basics/log_replay/plan_repair_2.png +0 -0
  45. data/doc/guide/src/basics/log_replay/plan_repair_3.png +0 -0
  46. data/doc/guide/src/basics/log_replay/plan_repair_4.png +0 -0
  47. data/doc/guide/src/basics/log_replay/roby_log_main_window.png +0 -0
  48. data/doc/guide/src/basics/log_replay/roby_log_relation_window.png +0 -0
  49. data/doc/guide/src/basics/log_replay/roby_replay_event_representation.png +0 -0
  50. data/doc/guide/src/basics/plan_objects.page +71 -0
  51. data/doc/guide/src/basics/relations_display.page +203 -0
  52. data/doc/guide/src/basics/roby_cycle_overview.png +0 -0
  53. data/doc/guide/src/basics/shell.page +102 -0
  54. data/doc/guide/src/basics/summary.page +32 -0
  55. data/doc/guide/src/basics/tasks.page +357 -0
  56. data/doc/guide/src/basics_shell_header.txt +16 -0
  57. data/doc/guide/src/cycle/cycle-overview.png +0 -0
  58. data/doc/guide/src/cycle/cycle-overview.svg +208 -0
  59. data/doc/guide/src/cycle/error_handling.page +168 -0
  60. data/doc/guide/src/cycle/error_instantaneous_repair.png +0 -0
  61. data/doc/guide/src/cycle/error_instantaneous_repair.svg +1224 -0
  62. data/doc/guide/src/cycle/garbage_collection.page +10 -0
  63. data/doc/guide/src/cycle/index.page +23 -0
  64. data/doc/guide/src/cycle/propagation.page +154 -0
  65. data/doc/guide/src/cycle/propagation_diamond.png +0 -0
  66. data/doc/guide/src/cycle/propagation_diamond.svg +1279 -0
  67. data/doc/guide/src/default.css +319 -0
  68. data/doc/guide/src/default.template +74 -0
  69. data/doc/guide/src/htmldoc.metainfo +20 -0
  70. data/doc/guide/src/htmldoc.virtual +18 -0
  71. data/doc/guide/src/images/bodybg.png +0 -0
  72. data/doc/guide/src/images/contbg.png +0 -0
  73. data/doc/guide/src/images/footerbg.png +0 -0
  74. data/doc/guide/src/images/gradient1.png +0 -0
  75. data/doc/guide/src/images/gradient2.png +0 -0
  76. data/doc/guide/src/index.page +7 -0
  77. data/doc/guide/src/introduction/index.page +29 -0
  78. data/doc/guide/src/introduction/install.page +133 -0
  79. data/doc/{papers.rdoc → guide/src/introduction/publications.page} +5 -2
  80. data/doc/{videos.rdoc → guide/src/introduction/videos.page} +4 -2
  81. data/doc/guide/src/plugins/fault_tolerance.page +44 -0
  82. data/doc/guide/src/plugins/index.page +11 -0
  83. data/doc/guide/src/plugins/subsystems.page +45 -0
  84. data/doc/guide/src/relations/dependency.page +89 -0
  85. data/doc/guide/src/relations/index.page +12 -0
  86. data/doc/misc/update_github +24 -0
  87. data/doc/tutorials/02-GoForward.rdoc +3 -3
  88. data/ext/graph/graph.cc +46 -0
  89. data/lib/roby.rb +57 -22
  90. data/lib/roby/app.rb +132 -112
  91. data/lib/roby/app/plugins/rake.rb +21 -0
  92. data/lib/roby/app/rake.rb +0 -7
  93. data/lib/roby/app/run.rb +1 -1
  94. data/lib/roby/app/scripts/distributed.rb +1 -2
  95. data/lib/roby/app/scripts/generate/bookmarks.rb +1 -1
  96. data/lib/roby/app/scripts/results.rb +2 -1
  97. data/lib/roby/app/scripts/run.rb +6 -2
  98. data/lib/roby/app/scripts/shell.rb +11 -11
  99. data/lib/roby/config.rb +1 -1
  100. data/lib/roby/decision_control.rb +62 -3
  101. data/lib/roby/distributed.rb +4 -0
  102. data/lib/roby/distributed/base.rb +8 -0
  103. data/lib/roby/distributed/communication.rb +12 -8
  104. data/lib/roby/distributed/connection_space.rb +61 -44
  105. data/lib/roby/distributed/distributed_object.rb +1 -1
  106. data/lib/roby/distributed/notifications.rb +22 -30
  107. data/lib/roby/distributed/peer.rb +13 -8
  108. data/lib/roby/distributed/proxy.rb +5 -5
  109. data/lib/roby/distributed/subscription.rb +4 -4
  110. data/lib/roby/distributed/transaction.rb +3 -3
  111. data/lib/roby/event.rb +176 -110
  112. data/lib/roby/exceptions.rb +12 -4
  113. data/lib/roby/execution_engine.rb +1604 -0
  114. data/lib/roby/external_process_task.rb +225 -0
  115. data/lib/roby/graph.rb +0 -6
  116. data/lib/roby/interface.rb +221 -137
  117. data/lib/roby/log/console.rb +5 -3
  118. data/lib/roby/log/data_stream.rb +94 -16
  119. data/lib/roby/log/dot.rb +8 -8
  120. data/lib/roby/log/event_stream.rb +13 -3
  121. data/lib/roby/log/file.rb +43 -18
  122. data/lib/roby/log/gui/basic_display_ui.rb +89 -0
  123. data/lib/roby/log/gui/chronicle_view_ui.rb +90 -0
  124. data/lib/roby/log/gui/data_displays.rb +4 -5
  125. data/lib/roby/log/gui/data_displays_ui.rb +146 -0
  126. data/lib/roby/log/gui/relations.rb +18 -18
  127. data/lib/roby/log/gui/relations_ui.rb +120 -0
  128. data/lib/roby/log/gui/relations_view_ui.rb +144 -0
  129. data/lib/roby/log/gui/replay.rb +41 -13
  130. data/lib/roby/log/gui/replay_controls.rb +3 -0
  131. data/lib/roby/log/gui/replay_controls.ui +133 -110
  132. data/lib/roby/log/gui/replay_controls_ui.rb +249 -0
  133. data/lib/roby/log/hooks.rb +19 -18
  134. data/lib/roby/log/logger.rb +7 -6
  135. data/lib/roby/log/notifications.rb +4 -4
  136. data/lib/roby/log/plan_rebuilder.rb +20 -22
  137. data/lib/roby/log/relations.rb +44 -16
  138. data/lib/roby/log/server.rb +1 -4
  139. data/lib/roby/log/timings.rb +88 -19
  140. data/lib/roby/plan-object.rb +135 -11
  141. data/lib/roby/plan.rb +408 -224
  142. data/lib/roby/planning/loops.rb +32 -25
  143. data/lib/roby/planning/model.rb +157 -51
  144. data/lib/roby/planning/task.rb +47 -20
  145. data/lib/roby/query.rb +128 -92
  146. data/lib/roby/relations.rb +254 -136
  147. data/lib/roby/relations/conflicts.rb +6 -9
  148. data/lib/roby/relations/dependency.rb +358 -0
  149. data/lib/roby/relations/ensured.rb +0 -1
  150. data/lib/roby/relations/error_handling.rb +0 -1
  151. data/lib/roby/relations/events.rb +0 -2
  152. data/lib/roby/relations/executed_by.rb +26 -11
  153. data/lib/roby/relations/planned_by.rb +14 -14
  154. data/lib/roby/robot.rb +46 -0
  155. data/lib/roby/schedulers/basic.rb +34 -0
  156. data/lib/roby/standalone.rb +4 -0
  157. data/lib/roby/standard_errors.rb +21 -15
  158. data/lib/roby/state/events.rb +5 -4
  159. data/lib/roby/support.rb +107 -6
  160. data/lib/roby/task-operations.rb +23 -19
  161. data/lib/roby/task.rb +522 -148
  162. data/lib/roby/task_index.rb +80 -0
  163. data/lib/roby/test/common.rb +283 -44
  164. data/lib/roby/test/distributed.rb +53 -37
  165. data/lib/roby/test/testcase.rb +9 -204
  166. data/lib/roby/test/tools.rb +3 -3
  167. data/lib/roby/transactions.rb +154 -111
  168. data/lib/roby/transactions/proxy.rb +40 -7
  169. data/manifest.xml +20 -0
  170. data/plugins/fault_injection/README.txt +0 -3
  171. data/plugins/fault_injection/Rakefile +2 -8
  172. data/plugins/fault_injection/app.rb +1 -1
  173. data/plugins/fault_injection/fault_injection.rb +3 -3
  174. data/plugins/fault_injection/test/test_fault_injection.rb +19 -25
  175. data/plugins/subsystems/README.txt +0 -3
  176. data/plugins/subsystems/Rakefile +2 -7
  177. data/plugins/subsystems/app.rb +27 -16
  178. data/plugins/subsystems/test/app/config/init.rb +3 -0
  179. data/plugins/subsystems/test/app/planners/main.rb +1 -1
  180. data/plugins/subsystems/test/app/tasks/services.rb +1 -1
  181. data/plugins/subsystems/test/test_subsystems.rb +23 -16
  182. data/test/distributed/test_communication.rb +32 -15
  183. data/test/distributed/test_connection.rb +28 -26
  184. data/test/distributed/test_execution.rb +59 -54
  185. data/test/distributed/test_mixed_plan.rb +34 -34
  186. data/test/distributed/test_plan_notifications.rb +26 -26
  187. data/test/distributed/test_protocol.rb +57 -48
  188. data/test/distributed/test_query.rb +11 -7
  189. data/test/distributed/test_remote_plan.rb +71 -71
  190. data/test/distributed/test_transaction.rb +50 -47
  191. data/test/mockups/external_process +28 -0
  192. data/test/planning/test_loops.rb +163 -119
  193. data/test/planning/test_model.rb +3 -3
  194. data/test/planning/test_task.rb +27 -7
  195. data/test/relations/test_conflicts.rb +3 -3
  196. data/test/relations/test_dependency.rb +324 -0
  197. data/test/relations/test_ensured.rb +2 -2
  198. data/test/relations/test_executed_by.rb +94 -19
  199. data/test/relations/test_planned_by.rb +11 -9
  200. data/test/suite_core.rb +6 -3
  201. data/test/suite_distributed.rb +1 -0
  202. data/test/suite_planning.rb +1 -0
  203. data/test/suite_relations.rb +2 -2
  204. data/test/tasks/test_external_process.rb +126 -0
  205. data/test/{test_thread_task.rb → tasks/test_thread_task.rb} +17 -20
  206. data/test/test_bgl.rb +21 -1
  207. data/test/test_event.rb +229 -155
  208. data/test/test_exceptions.rb +79 -80
  209. data/test/test_execution_engine.rb +987 -0
  210. data/test/test_gui.rb +1 -1
  211. data/test/test_interface.rb +11 -5
  212. data/test/test_log.rb +18 -7
  213. data/test/test_log_server.rb +1 -0
  214. data/test/test_plan.rb +229 -395
  215. data/test/test_query.rb +193 -35
  216. data/test/test_relations.rb +88 -8
  217. data/test/test_state.rb +55 -37
  218. data/test/test_support.rb +1 -1
  219. data/test/test_task.rb +371 -218
  220. data/test/test_testcase.rb +32 -16
  221. data/test/test_transactions.rb +211 -170
  222. data/test/test_transactions_proxy.rb +37 -19
  223. metadata +169 -71
  224. data/.gitignore +0 -29
  225. data/doc/styles/allison.css +0 -314
  226. data/doc/styles/allison.js +0 -316
  227. data/doc/styles/allison.rb +0 -276
  228. data/doc/styles/jamis.rb +0 -593
  229. data/lib/roby/control.rb +0 -746
  230. data/lib/roby/executives/simple.rb +0 -30
  231. data/lib/roby/propagation.rb +0 -562
  232. data/lib/roby/relations/hierarchy.rb +0 -239
  233. data/lib/roby/transactions/updates.rb +0 -139
  234. data/test/relations/test_hierarchy.rb +0 -158
  235. data/test/test_control.rb +0 -399
  236. data/test/test_propagation.rb +0 -210
@@ -1,17 +1,6 @@
1
1
  # Control configuration
2
- control:
3
- # Abort if a task/event exception is not caught
4
- # abort_on_exception: false
5
- # Abort if an application exception occurs
6
- # abort_on_application_exception: false
7
-
8
- # The executive. Set to 'none' to disable.
9
- # The executive object determines, in the current plan, what are
10
- # the tasks which must be started. The 'simple' executive starts
11
- # all tasks that have no predecessors.
12
- executive: simple
13
-
14
- # The length of a cycle (in seconds)
2
+ engine:
3
+ # The length of a cycle (in seconds). It defaults to 100ms.
15
4
  # cycle: 0.1
16
5
 
17
6
  # Logging configuration
@@ -19,10 +8,25 @@ log:
19
8
  # Where log files go
20
9
  # dir: log/
21
10
 
22
- # Log system events (default: false)
11
+ # Log system events. It can be either true, false or stats. If true, all
12
+ # plan-level events are logged, allowing to use the roby-log GUI to replay
13
+ # the plans. If false, nothing is logged. If set to stats, only execution
14
+ # statistics are logged. This mode is useful to monitor execution latencies
15
+ # without having the big impact of full logging.
16
+ #
17
+ # See the roby-log tool to read the generated files, Roby::Log::Logfile to read the
18
+ # files from a Ruby script and Roby::Log::Timings for reading and using per-cycle
19
+ # statistics.
20
+ #
21
+ # The default is stats
22
+ #
23
23
  # events: true
24
24
 
25
- # Disables the log server (default: enabled)
25
+ # Set to false to disables the log server and true to enable it (it is enabled by
26
+ # default). The log server allows to display the controller state remotely by using the
27
+ # <tt>roby-log</tt> tool. Note that it is completely separated from the Roby remote
28
+ # shell, which is always enabled.
29
+ #
26
30
  # server: false
27
31
  #
28
32
  # ... or configure it
@@ -32,17 +36,32 @@ log:
32
36
  # # The discovery period
33
37
  # period: 10
34
38
 
35
- # Logging levels. It is a hash of component_name: level (where level is one
36
- # of DEBUG, INFO, WARN and FATAL). The output can be redirected in a file
37
- # using level:filename, in which case 'filename' is relative to the log
38
- # directory. Any occurence of 'ROBOT' in filename is replaced by the robot
39
- # name
39
+ # Logging levels.
40
+ #
41
+ # Logging in Roby is controlled per-module in a hierarchical way. It means that to get
42
+ # debugging output for the whole framework, set
43
+ #
44
+ # levels:
45
+ # roby: DEBUG
46
+ #
47
+ # now, if you want to have it do debug for everything but the classes in
48
+ # Roby::Distributed, do
49
+ #
50
+ # levels:
51
+ # roby: DEBUG
52
+ # roby/distributed: INFO
53
+ #
54
+ # The available logging levels are DEBUG, INFO, WARN and FATAL. The output can be
55
+ # redirected in a file using level:filename, in which case 'filename' is relative to the
56
+ # log directory. Any occurence of 'ROBOT' in filename is replaced by the robot name. For
57
+ # instance, in a 'dala' robot, the following setup would redirect the debugging outut of
58
+ # Roby::Distributed classes into data-distributed.log:
40
59
  #
41
60
  # levels:
42
- # roby: INFO
43
- # roby/planning: DEBUG
44
61
  # roby/distributed: DEBUG:ROBOT-distributed.log
45
- # genom: INFO
62
+ #
63
+ # Log files are saved in the log directory (controlled by the 'dir' option above, it is
64
+ # 'log' by default).
46
65
 
47
66
  # dRoby neighbour discovery
48
67
  discovery:
@@ -62,26 +81,6 @@ droby:
62
81
  # 'host:port', or just ':port'
63
82
  # host: ":48902"
64
83
 
65
- # Genom configuration
66
- genom:
67
- # The memory size allocated for H2
68
- # mem_size: 4000000
69
- # If true, do not remove H2 devices when the application quit
70
- # keep_h2: false
71
-
72
- # Pocosim configuration
73
- pocosim:
74
- # The host of the GDHE display
75
- # display: localhost
76
-
77
- # An initialization script to display the scene on GDHE. The file is searched
78
- # in the data/ director
79
- # gdhe: lousa.gdhe
80
-
81
- # The Gazebo world file for pocosim/gazebo simulations. The file is searched
82
- # in the data/ directory
83
- # gazebo: lousa.world
84
-
85
84
  # Per-robot configuration. In these, you can override global options, or set
86
85
  # new options.
87
86
  # dala:
@@ -5,3 +5,29 @@
5
5
  # Roby.app.using 'fault_injection'
6
6
  # Roby.app.using 'subsystems'
7
7
 
8
+ ##############################
9
+ # Sets some configuration options
10
+ #
11
+ # If true, the engine aborts if an uncaught task or event exception is
12
+ # received. Defaults to false, as Roby has meaningful ways to handle those
13
+ # Roby.app.abort_on_exception = false
14
+ #
15
+ # If true, the engine aborts if an exception is raised outside of the reach of
16
+ # the plan-based error management. Defaults to true, as there is no safe ways
17
+ # to handle those.
18
+ # Roby.app.abort_on_application_exception = true
19
+
20
+ ##############################
21
+ # Set the decision control object to be used during execution (can also be
22
+ # done per-robot)
23
+ #
24
+ # Roby.control = Roby::DecisionControl.new
25
+
26
+
27
+ ##############################
28
+ # Set the scheduler object to be used during execution (can also be done
29
+ # per-robot by setting it in config/#{ROBOT}.rb)
30
+
31
+ require 'roby/schedulers/basic'
32
+ Roby.scheduler = Roby::Schedulers::Basic.new
33
+
@@ -0,0 +1,123 @@
1
+ require 'utilrb/objectstats'
2
+ require 'utilrb/value_set'
3
+ require 'enumerator'
4
+ require 'set'
5
+
6
+ GC.disable
7
+
8
+ puts "==== Iteration"
9
+ [(1..10_000), (1..10_000).to_a, (1..10_000).to_value_set, (1..10_000).enum_for, (1..10_000).to_set].each do |set|
10
+ before = ObjectSpace.live_objects
11
+ for obj in set
12
+ 10
13
+ end
14
+ after = ObjectSpace.live_objects
15
+ puts "#{set.class} for: #{after - before}"
16
+
17
+ before = ObjectSpace.live_objects
18
+ set.each { |obj| 10 }
19
+ after = ObjectSpace.live_objects
20
+ puts "#{set.class} each: #{after - before}"
21
+ end
22
+
23
+ puts "\n===== Method calls"
24
+ def bm_args_yield(a, b)
25
+ yield(a, b) if block_given?
26
+ end
27
+ def bm_args_yield_through_block(a, b, &block)
28
+ block.call(a, b) if block
29
+ end
30
+
31
+ def bm_method_call
32
+ end
33
+
34
+ def bm_yield
35
+ yield
36
+ end
37
+ def bm_block_yield(&block)
38
+ yield
39
+ end
40
+
41
+ def bm_block(do_call, &block)
42
+ block.call if do_call
43
+ end
44
+
45
+ class Test
46
+ def bla
47
+ end
48
+ end
49
+ class Foo < Test
50
+ def bla
51
+ super
52
+ end
53
+ end
54
+
55
+
56
+ before = ObjectSpace.live_objects
57
+ bm_method_call
58
+ after = ObjectSpace.live_objects
59
+ puts "Method call: #{after - before}"
60
+
61
+ test = Foo.new
62
+ before = ObjectSpace.live_objects
63
+ test.bla
64
+ after = ObjectSpace.live_objects
65
+ puts "Method call with super: #{after - before}"
66
+
67
+ before = ObjectSpace.live_objects
68
+ bm_method_call { 10 }
69
+ after = ObjectSpace.live_objects
70
+ puts "Method call with block m(): #{after - before}"
71
+
72
+ before = ObjectSpace.live_objects
73
+ bm_block(false) { 10 }
74
+ after = ObjectSpace.live_objects
75
+ puts "Method call with block m(&block): #{after - before}"
76
+
77
+ before = ObjectSpace.live_objects
78
+ bm_yield { 10 }
79
+ after = ObjectSpace.live_objects
80
+ puts "Yield: #{after - before}"
81
+
82
+ before = ObjectSpace.live_objects
83
+ bm_block(true) { 10 }
84
+ after = ObjectSpace.live_objects
85
+ puts "Block & #call: #{after - before}"
86
+
87
+ before = ObjectSpace.live_objects
88
+ bm_block_yield { 10 }
89
+ after = ObjectSpace.live_objects
90
+ puts "Block and yield: #{after - before}"
91
+
92
+ p = Proc.new { 10 }
93
+ before = ObjectSpace.live_objects
94
+ p.call
95
+ after = ObjectSpace.live_objects
96
+ puts "Proc#call: #{after - before}"
97
+
98
+ puts "\n=== Exceptions"
99
+ def bm_exception
100
+ rescue
101
+ ensure
102
+ end
103
+ before = ObjectSpace.live_objects
104
+ begin
105
+ rescue Exception
106
+ ensure
107
+ end
108
+ after = ObjectSpace.live_objects
109
+ puts "begin-rescue-ensure: #{after - before}"
110
+
111
+ before = ObjectSpace.live_objects
112
+ bm_exception
113
+ after = ObjectSpace.live_objects
114
+ puts "begin-rescue-ensure method: #{after - before}"
115
+
116
+ puts "\n=== Misc"
117
+ before = ObjectSpace.live_objects
118
+ defined? yield
119
+ after = ObjectSpace.live_objects
120
+ puts "defined?: #{after - before}"
121
+
122
+
123
+
@@ -0,0 +1,67 @@
1
+ TOP_SRC_DIR = File.expand_path( File.join(File.dirname(__FILE__), '..') )
2
+ $LOAD_PATH.unshift TOP_SRC_DIR
3
+ $LOAD_PATH.unshift File.join(TOP_SRC_DIR, 'test')
4
+
5
+ require 'roby/distributed/connection_space'
6
+
7
+ TEST_SIZE=20
8
+ BASE_PERIOD=0.5
9
+
10
+ include Roby
11
+ include Roby::Distributed
12
+ BROADCAST = (1..10).map { |i| "127.0.0.#{i}" }
13
+
14
+ def test(discovery_period)
15
+ start_r, start_w= IO.pipe
16
+ quit_r, quit_w = IO.pipe
17
+ remote_pid = fork do
18
+ start_r.close
19
+ quit_w.close
20
+
21
+ DRb.start_service
22
+ Distributed.state = ConnectionSpace.new :period => discovery_period, :ring_discovery => true, :ring_broadcast => BROADCAST
23
+ Distributed.publish :bind => '127.0.0.2'
24
+
25
+ start_w.write('OK')
26
+ quit_r.read(2)
27
+ Distributed.unpublish
28
+ end
29
+ start_w.close
30
+ quit_r.close
31
+ start_r.read(2)
32
+
33
+ DRb.start_service
34
+ Distributed.state = ConnectionSpace.new :period => discovery_period, :ring_discovery => true, :ring_broadcast => BROADCAST
35
+ Distributed.publish :bind => '127.0.0.1'
36
+
37
+ Distributed.state.start_neighbour_discovery
38
+ Distributed.state.wait_discovery
39
+ raise unless Distributed.neighbours.find { |n| n.name == "#{Socket.gethostname}-#{remote_pid}" }
40
+
41
+ ensure
42
+ Distributed.unpublish
43
+ start_r.close
44
+ quit_w.write('OK')
45
+ Process.waitpid(remote_pid)
46
+ end
47
+
48
+ period = BASE_PERIOD
49
+ error_count = 0
50
+ while (error_count.to_f / TEST_SIZE) < 0.1
51
+ error_count = 0
52
+ STDERR.print "#{period}"
53
+ (0..TEST_SIZE).each do |i|
54
+ begin
55
+ test(period)
56
+ rescue Exception => e
57
+ if e.class != RuntimeError
58
+ STDERR.puts e.message
59
+ end
60
+ error_count += 1
61
+ end
62
+ STDERR.print "\r#{period} (#{i}|#{error_count}|#{TEST_SIZE})"
63
+ end
64
+ STDERR.puts
65
+ period /= 2
66
+ end
67
+
@@ -0,0 +1,48 @@
1
+ #! /usr/bin/env ruby
2
+ require 'roby'
3
+ require 'benchmark'
4
+ include Roby
5
+
6
+ TASK_COUNT = 100
7
+ EVENT_COUNT = 50
8
+ RELATION_COUNT = 200
9
+
10
+ tasks = (1..TASK_COUNT).map { Task.new }
11
+ events = (1..EVENT_COUNT).map { EventGenerator.new }
12
+
13
+ plan = Plan.new
14
+ tasks.each { |t| plan.permanent(t) }
15
+ plan.discover(events)
16
+
17
+ objects = tasks + events
18
+ RELATION_COUNT.times do
19
+ parent = objects.random_element
20
+ child = objects.random_element
21
+ next if parent == child
22
+
23
+ if parent.kind_of?(EventGenerator)
24
+ if !child.kind_of?(EventGenerator)
25
+ child = child.bound_events.random_element.last
26
+ end
27
+ elsif child.kind_of?(EventGenerator)
28
+ parent = parent.bound_events.random_element.last
29
+ end
30
+
31
+ relation = if parent.kind_of?(EventGenerator)
32
+ EventStructure.relations.random_element
33
+ else
34
+ TaskStructure.relations.random_element
35
+ end
36
+
37
+ begin
38
+ parent.add_child_object(child, relation, :success => [], :failure => [])
39
+ rescue CycleFoundError
40
+ end
41
+ end
42
+
43
+ Benchmark.bm(15) do |bm|
44
+ bm.report("unneeded_events") { plan.unneeded_events }
45
+ bm.report("unneeded_tasks") { plan.unneeded_tasks }
46
+ bm.report("garbage_collect") { plan.garbage_collect }
47
+ end
48
+
@@ -0,0 +1,31 @@
1
+ TOP_SRC_DIR = File.expand_path( File.join(File.dirname(__FILE__), '..') )
2
+ $LOAD_PATH.unshift TOP_SRC_DIR
3
+ $LOAD_PATH.unshift File.join(TOP_SRC_DIR, 'test')
4
+ require 'test_config'
5
+ require 'genom/runner'
6
+ require 'roby/adapters/genom'
7
+
8
+ include Roby
9
+
10
+ GC.disable
11
+ ::Genom::Runner.h2 do |env|
12
+ ::Genom.connect do
13
+ Roby::Genom::GenomModule('mockup')
14
+ env.start_modules('mockup')
15
+
16
+ task = Roby::Genom::Mockup.start
17
+ task.start!
18
+
19
+ while !task.running?
20
+ $stderr.puts "waiting for task to start"
21
+ Roby.process_events
22
+ end
23
+
24
+ task.activity.abort.wait
25
+ while !task.finished?
26
+ $stderr.puts "waiting for task to end"
27
+ Roby.process_events
28
+ end
29
+ end
30
+ end
31
+
@@ -0,0 +1,62 @@
1
+ TOP_SRC_DIR = File.expand_path( File.join(File.dirname(__FILE__), '..') )
2
+ $LOAD_PATH.unshift TOP_SRC_DIR
3
+ $LOAD_PATH.unshift File.join(TOP_SRC_DIR, 'test')
4
+
5
+ require 'roby'
6
+ require 'roby/transactions'
7
+ require 'utilrb/objectstats'
8
+
9
+ include Roby
10
+
11
+ TASK_COUNT = 10
12
+ RELATION_COUNT = 10
13
+ def display_object_count
14
+ count = ObjectStats.count_by_class.
15
+ find_all { |k, o| k.name =~ /Roby/ }.
16
+ sort_by { |k, o| k.name }.
17
+ map { |k, o| "#{k} #{o}" }
18
+
19
+ puts " #{count.join("\n ")}"
20
+ end
21
+
22
+
23
+
24
+ def build_and_commit
25
+ plan = Plan.new
26
+
27
+ BenchmarkAllocation.bmbm(7) do |x|
28
+ trsc = Transaction.new(plan)
29
+ plan_tasks, trsc_tasks = nil
30
+ x.report("alloc") do
31
+ trsc_tasks = (1..TASK_COUNT).map { trsc.discover(t = Task.new); t }
32
+ plan_tasks = (1..TASK_COUNT).map { plan.discover(t = Task.new); trsc[t] }
33
+ end
34
+
35
+ # Add random relations
36
+ arrays = [plan_tasks, trsc_tasks]
37
+ relation_count = [0, 0]
38
+
39
+ from_origin, to_origin = (1..2).map { rand(2) }
40
+ x.report("relations") do
41
+ RELATION_COUNT.times do
42
+ from = arrays[from_origin][rand(TASK_COUNT)]
43
+ to = arrays[to_origin][rand(TASK_COUNT)]
44
+ relation_count[from_origin] += 1
45
+ relation_count[to_origin] += 1
46
+ begin
47
+ from.realized_by to
48
+ rescue CycleFoundError
49
+ end
50
+ end
51
+ end
52
+
53
+ x.report("commit") do
54
+ trsc.commit_transaction
55
+ end
56
+ x.report("clear") do
57
+ plan.clear
58
+ end
59
+ end
60
+ end
61
+ build_and_commit
62
+