drake 0.8.4.1.0.18 → 0.8.4.1.1.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.
data/Rakefile.drake CHANGED
@@ -1,28 +1,6 @@
1
1
 
2
- require 'fileutils'
3
-
4
- ######################################################################
5
- # git
6
-
7
2
  def git(*args)
8
- cmd = ["git"] + args
9
- sh(*cmd)
10
- end
11
-
12
- task :add_contrib_first_time => :init_contrib do
13
- git(*%w!merge --squash -s ours --no-commit comp_tree/master!)
14
- git(*%w!read-tree --prefix=contrib/comp_tree -u comp_tree/master!)
15
- git("commit", "-m", "add comp_tree package")
16
- end
17
-
18
- task :init_contrib do
19
- unless `git remote`.split.include? "comp_tree"
20
- git(*%w!remote add -f comp_tree git@github.com:quix/comp_tree.git!)
21
- end
22
- end
23
-
24
- task :run_pull_contrib => :init_contrib do
25
- git(*%w!pull --no-commit -s subtree comp_tree master!)
3
+ sh("git", *args)
26
4
  end
27
5
 
28
6
  task :pull_mainline do
@@ -31,14 +9,7 @@ task :pull_mainline do
31
9
  refs/heads/master:refs/heads/origin!)
32
10
  end
33
11
 
34
- task :pull_contrib => [ :init_contrib, :run_pull_contrib ]
35
-
36
- ######################################################################
37
- # drake_release
38
-
39
- task :drake_prerelease => [:clean, :gemspec] do
40
- rm_rf("html")
41
- rm_rf("pkg")
12
+ task :drake_prerelease => [:clobber, :gemspec] do
42
13
  unless `git status` =~ %r!nothing to commit \(working directory clean\)!
43
14
  raise "Directory not clean"
44
15
  end
data/lib/rake.rb CHANGED
@@ -29,7 +29,7 @@
29
29
  # as a library via a require statement, but it can be distributed
30
30
  # independently as an application.
31
31
 
32
- RAKEVERSION = '0.8.4.1.0.18'
32
+ RAKEVERSION = '0.8.4.1.1.0'
33
33
 
34
34
  require 'rbconfig'
35
35
  require 'fileutils'
@@ -581,9 +581,8 @@ module Rake
581
581
  end
582
582
 
583
583
  def base_invoke(*args) #:nodoc:
584
- invoke_with_call_chain(
585
- TaskArguments.new(arg_names, args),
586
- InvocationChain::EMPTY)
584
+ task_args = TaskArguments.new(arg_names, args)
585
+ invoke_with_call_chain(task_args, InvocationChain::EMPTY)
587
586
  end
588
587
 
589
588
  # Invoke the task if it is needed. Prerequites are invoked first.
@@ -591,12 +590,12 @@ module Rake
591
590
  if application.num_threads == 1
592
591
  base_invoke(*args)
593
592
  else
594
- if application.parallel_lock.locked?
593
+ if application.parallel.lock.locked?
595
594
  raise "Calling Task#invoke within a task is not allowed."
596
595
  end
597
- application.parallel_lock.synchronize {
598
- application.parallel_tasks.clear
599
- application.parallel_parent_flags.clear
596
+ application.parallel.lock.synchronize {
597
+ application.parallel.tasks.clear
598
+ application.parallel.needed.clear
600
599
  base_invoke(*args)
601
600
  application.invoke_parallel(self.name)
602
601
  }
@@ -618,40 +617,25 @@ module Rake
618
617
  @prerequisites = @prerequisites.sort_by { rand }
619
618
  end
620
619
 
621
- prereqs =
622
- if application.num_threads == 1
623
- invoke_prerequisites(task_args, new_chain)
624
- nil
625
- else
626
- invoke_prerequisites_parallel(task_args, new_chain)
627
- end
628
-
629
620
  if application.num_threads == 1
630
- #
631
- # single-threaded mode
632
- #
633
- if needed?
634
- execute(task_args)
635
- end
621
+ invoke_prerequisites(task_args, new_chain)
622
+ execute(task_args) if needed?
636
623
  else
637
624
  #
638
- # parallel mode
625
+ # Parallel mode -- gather tasks for batch execution.
639
626
  #
640
627
  # Either the task knows it's needed or we've marked it as
641
- # such. See next comments.
628
+ # needed.
642
629
  #
643
- if application.parallel_parent_flags[self] or needed?
644
- # gather tasks for batch execution
645
- application.parallel_tasks[name] = [task_args, prereqs]
646
-
647
- #
648
- # Since this is a dry run, parents must be manually marked
649
- # as needed. Files are not created or modified, so the
650
- # the 'needed?' flag does not propagate.
651
- #
630
+ # Why do we manually mark tasks as needed? Since this is a
631
+ # dry run, files are not created or modified. Therefore the
632
+ # 'needed?' result does not propagate through the recursion.
633
+ #
634
+ prereqs = invoke_prerequisites_parallel(task_args, new_chain)
635
+ if needed? or application.parallel.needed[self]
636
+ application.parallel.tasks[name] = [task_args, prereqs]
652
637
  unless invocation_chain == InvocationChain::EMPTY
653
- application.
654
- parallel_parent_flags[invocation_chain.value] = true
638
+ application.parallel.needed[invocation_chain.value] = true
655
639
  end
656
640
  end
657
641
  end
@@ -1028,19 +1012,17 @@ end
1028
1012
  #
1029
1013
  # +seq+ : Force tasks to be executed sequentially.
1030
1014
  #
1031
- (class << self ; self ; end).class_eval {
1032
- # use this form to cleanly hide the lambda
1033
- seq_lambda = lambda { |*task_names|
1015
+ def seq
1016
+ Rake::SEQ_LAMBDA
1017
+ end
1018
+ module Rake
1019
+ SEQ_LAMBDA = lambda { |*task_names|
1034
1020
  (1...task_names.size).each { |n|
1035
1021
  task task_names[n] => task_names[n - 1]
1036
1022
  }
1037
1023
  task_names.last
1038
1024
  }
1039
-
1040
- define_method(:seq) {
1041
- seq_lambda
1042
- }
1043
- }
1025
+ end
1044
1026
 
1045
1027
  # ###########################################################################
1046
1028
  # This a FileUtils extension that defines several additional commands to be
@@ -1773,9 +1755,7 @@ module Rake
1773
1755
  alias :last_comment :last_description # Backwards compatibility
1774
1756
 
1775
1757
  attr_accessor :num_threads
1776
- attr_reader :parallel_tasks #:nodoc:
1777
- attr_reader :parallel_lock #:nodoc:
1778
- attr_reader :parallel_parent_flags #:nodoc:
1758
+ attr_reader :parallel
1779
1759
 
1780
1760
  def initialize
1781
1761
  super
@@ -1785,9 +1765,11 @@ module Rake
1785
1765
  @last_description = nil
1786
1766
 
1787
1767
  @num_threads = 1
1788
- @parallel_tasks = Hash.new
1789
- @parallel_lock = Mutex.new
1790
- @parallel_parent_flags = Hash.new
1768
+
1769
+ @parallel = Struct.new(:tasks, :needed, :lock).new
1770
+ @parallel.tasks = Hash.new
1771
+ @parallel.needed = Hash.new
1772
+ @parallel.lock = Mutex.new
1791
1773
  end
1792
1774
 
1793
1775
  def create_rule(*args, &block)
@@ -16,9 +16,7 @@ module Rake::CompTree
16
16
 
17
17
  def compute_multithreaded(root, num_threads)
18
18
  #trace "Computing #{root.name} with #{num_threads} threads"
19
-
20
- result = nil
21
-
19
+ finished = nil
22
20
  tree_mutex = Mutex.new
23
21
  node_finished_condition = ConditionVariable.new
24
22
  thread_wake_condition = ConditionVariable.new
@@ -37,8 +35,8 @@ module Rake::CompTree
37
35
 
38
36
  loop_with(:leave, :again) {
39
37
  node = tree_mutex.synchronize {
40
- #trace "Thread #{thread_index} aquired tree lock; begin node search"
41
- if result
38
+ #trace "Thread #{thread_index} acquired tree lock; begin search"
39
+ if finished
42
40
  #trace "Thread #{thread_index} detected finish"
43
41
  num_threads_in_use -= 1
44
42
  throw :leave
@@ -46,7 +44,8 @@ module Rake::CompTree
46
44
  #
47
45
  # Find a node. The node we obtain, if any, will be locked.
48
46
  #
49
- if node = find_node(root)
47
+ node = find_node(root)
48
+ if node
50
49
  #trace "Thread #{thread_index} found node #{node.name}"
51
50
  node
52
51
  else
@@ -58,7 +57,10 @@ module Rake::CompTree
58
57
  }
59
58
 
60
59
  #trace "Thread #{thread_index} computing node"
61
- node_result = compute_node(node)
60
+ #debug {
61
+ # node.trace_compute
62
+ #}
63
+ node.compute
62
64
  #trace "Thread #{thread_index} node computed; waiting for tree lock"
63
65
 
64
66
  tree_mutex.synchronize {
@@ -66,25 +68,28 @@ module Rake::CompTree
66
68
  #debug {
67
69
  # name = "#{node.name}" + ((node == root) ? " (ROOT NODE)" : "")
68
70
  # initial = "Thread #{thread_index} compute result for #{name}: "
69
- # status = node_result.is_a?(Exception) ? "error" : "success"
71
+ # status = node.computed.is_a?(Exception) ? "error" : "success"
70
72
  # trace initial + status
71
- # trace "Thread #{thread_index} node result: #{node_result}"
73
+ # trace "Thread #{thread_index} node result: #{node.result}"
72
74
  #}
73
75
 
74
- node.result = node_result
75
-
76
+ if node.computed.is_a? Exception
77
+ #
78
+ # An error occurred; we are done.
79
+ #
80
+ finished = node.computed
81
+ elsif node == root
82
+ #
83
+ # Root node was computed; we are done.
84
+ #
85
+ finished = true
86
+ end
87
+
76
88
  #
77
89
  # remove locks for this node (shared lock and own lock)
78
90
  #
79
91
  node.unlock
80
92
 
81
- if node == root or node_result.is_a? Exception
82
- #
83
- # Root node was computed or error occurred; we are done.
84
- #
85
- result = node_result
86
- end
87
-
88
93
  #
89
94
  # Tell the main thread that another node was computed.
90
95
  #
@@ -106,7 +111,7 @@ module Rake::CompTree
106
111
  #trace "Main: waking threads"
107
112
  thread_wake_condition.broadcast
108
113
 
109
- if result
114
+ if finished
110
115
  #trace "Main: detected finish."
111
116
  break
112
117
  end
@@ -129,17 +134,17 @@ module Rake::CompTree
129
134
  }
130
135
 
131
136
  #trace "Main: computation done."
132
- if result.is_a? Exception
133
- raise result
137
+ if finished.is_a? Exception
138
+ raise finished
134
139
  else
135
- result
140
+ root.result
136
141
  end
137
142
  end
138
143
 
139
144
  def find_node(node)
140
145
  # --- only called inside shared tree mutex
141
146
  #trace "Looking for a node, starting with #{node.name}"
142
- if node.result
147
+ if node.computed
143
148
  #
144
149
  # already computed
145
150
  #
@@ -158,20 +163,10 @@ module Rake::CompTree
158
163
  #
159
164
  #trace "Checking #{node.name}'s children"
160
165
  node.each_child { |child|
161
- if next_node = find_node(child)
162
- return next_node
163
- end
166
+ next_node = find_node(child) and return next_node
164
167
  }
165
168
  nil
166
169
  end
167
170
  end
168
-
169
- def compute_node(node)
170
- begin
171
- node.compute
172
- rescue Exception => e
173
- e
174
- end
175
- end
176
171
  end
177
172
  end
@@ -0,0 +1,42 @@
1
+ #
2
+ # Copyright (c) 2008 James M. Lawrence. All rights reserved.
3
+ #
4
+ # Permission is hereby granted, free of charge, to any person obtaining a copy
5
+ # of this software and associated documentation files (the "Software"), to deal
6
+ # in the Software without restriction, including without limitation the rights
7
+ # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8
+ # copies of the Software, and to permit persons to whom the Software is
9
+ # furnished to do so, subject to the following conditions:
10
+ #
11
+ # The above copyright notice and this permission notice shall be included in
12
+ # all copies or substantial portions of the Software.
13
+ #
14
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15
+ # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16
+ # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17
+ # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
+ # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19
+ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
20
+ # THE SOFTWARE.
21
+ #
22
+
23
+ require 'rake/comp_tree/driver'
24
+
25
+ module Rake end
26
+ module Rake::CompTree
27
+ class << self
28
+ #
29
+ # Build and run a new computation tree.
30
+ #
31
+ # A Driver instance is passed to the given block.
32
+ #
33
+ # Options hash:
34
+ #
35
+ # <tt>:node_class</tt> -- (Class) CompTree::Node subclass from
36
+ # which nodes are created.
37
+ #
38
+ def build(opts = nil)
39
+ yield Driver.new(opts)
40
+ end
41
+ end
42
+ end
@@ -13,9 +13,9 @@ module Rake::CompTree
13
13
  #
14
14
  class Driver
15
15
  include Algorithm
16
-
16
+
17
17
  #
18
- # Begin a new computation tree.
18
+ # Build and run a new computation tree.
19
19
  #
20
20
  # Options hash:
21
21
  #
@@ -23,18 +23,14 @@ module Rake::CompTree
23
23
  # which nodes are created.
24
24
  #
25
25
  def initialize(opts = nil)
26
- @node_class =
26
+ @node_class = (
27
27
  if opts and opts[:node_class]
28
28
  opts[:node_class]
29
29
  else
30
30
  Node
31
31
  end
32
-
32
+ )
33
33
  @nodes = Hash.new
34
-
35
- if block_given?
36
- yield self
37
- end
38
34
  end
39
35
 
40
36
  #
@@ -45,55 +41,43 @@ module Rake::CompTree
45
41
  #
46
42
  # Define a computation node.
47
43
  #
48
- # There are three distinct forms of a node definition. In each of
49
- # the following examples, a computation node named +area+ is
50
- # defined which depends on the nodes +height+, +width+, +offset+.
44
+ # The first argument is the name of the node to define.
45
+ # Subsequent arguments are the names of this node's children.
51
46
  #
52
- # The method_missing form:
53
- # driver.define_area(:width, :height, :offset) { |width, height, offset|
54
- # width*height - offset
55
- # }
47
+ # The values of the child nodes are passed to the block. The
48
+ # block returns the result of this node.
56
49
  #
57
- # The eval form:
58
- # driver.define_area :width, :height, :offset, %{
59
- # width*height - offset
60
- # }
61
- # (Note the '%' before the brace.)
50
+ # In this example, a computation node named +area+ is defined
51
+ # which depends on the nodes +width+ and +height+.
62
52
  #
63
- # The raw form:
64
- # driver.define(:area, :width, :height, :offset) { |width, height, offset|
65
- # width*height - offset
66
- # }
53
+ # driver.define(:area, :width, :height) { |width, height|
54
+ # width*height
55
+ # }
67
56
  #
68
57
  def define(*args, &block)
69
58
  parent_name = args.first
70
59
  children_names = args[1..-1]
71
60
 
72
61
  unless parent_name
73
- raise Error::ArgumentError, "No name given for node"
62
+ raise ArgumentError, "No name given for node"
74
63
  end
75
64
 
76
65
  #
77
66
  # retrieve or create parent and children
78
67
  #
79
- parent =
80
- if t = @nodes[parent_name]
81
- t
82
- else
83
- @nodes[parent_name] = @node_class.new(parent_name)
84
- end
68
+ parent = @nodes[parent_name] || (
69
+ @nodes[parent_name] = @node_class.new(parent_name)
70
+ )
85
71
 
86
72
  if parent.function
87
- raise Error::RedefinitionError, "Node #{parent.name} already defined."
73
+ raise RedefinitionError, "Node `#{parent.name.inspect}' redefined."
88
74
  end
89
75
  parent.function = block
90
76
 
91
77
  children = children_names.map { |child_name|
92
- if t = @nodes[child_name]
93
- t
94
- else
78
+ @nodes[child_name] || (
95
79
  @nodes[child_name] = @node_class.new(child_name)
96
- end
80
+ )
97
81
  }
98
82
 
99
83
  #
@@ -105,72 +89,37 @@ module Rake::CompTree
105
89
  }
106
90
  end
107
91
 
108
- #
109
- # parsing/evaling helper
110
- #
111
- def evaling_define(*args) #:nodoc:
112
- function_name = args[0]
113
- function_arg_names = args[1..-2]
114
- function_string = args.last.to_str
115
-
116
- comma_separated = function_arg_names.map { |name|
117
- name.to_s
118
- }.join(",")
119
-
120
- eval_me = %{
121
- lambda { |#{comma_separated}|
122
- #{function_string}
123
- }
124
- }
125
-
126
- function = eval(eval_me, TOPLEVEL_BINDING)
127
-
128
- define(function_name, *function_arg_names, &function)
129
- end
130
-
131
- def method_missing(symbol, *args, &block) #:nodoc:
132
- if match = symbol.to_s.match(%r!\Adefine_(\w+)\Z!)
133
- method_name = match.captures.first.to_sym
134
- if block
135
- define(method_name, *args, &block)
136
- else
137
- evaling_define(method_name, *args)
138
- end
139
- else
140
- super(symbol, *args, &block)
141
- end
142
- end
143
-
144
92
  #
145
93
  # Mark this node and all its children as uncomputed.
146
94
  #
147
95
  # Arguments:
148
96
  #
149
- # +name+ -- (Symbol) node name.
97
+ # +name+ -- unique node identifier (usually a symbol).
150
98
  #
151
99
  def reset(name)
152
100
  @nodes[name].reset
153
101
  end
154
102
 
155
103
  #
156
- # Check for a cyclic graph below the given node. Raises
157
- # CompTree::Error::CircularError if found.
104
+ # Check for a cyclic graph below the given node. If found,
105
+ # returns the names of the nodes (in order) which form a loop.
106
+ # Otherwise returns nil.
158
107
  #
159
108
  # Arguments:
160
109
  #
161
- # +name+ -- (Symbol) node name.
110
+ # +name+ -- unique node identifier (usually a symbol).
162
111
  #
163
112
  def check_circular(name)
164
- helper = lambda { |root, chain|
113
+ helper = Proc.new { |root, chain|
165
114
  if chain.include? root
166
- raise Error::CircularError,
167
- "Circular dependency detected: #{root} => #{chain.last} => #{root}"
115
+ return chain + [root]
168
116
  end
169
117
  @nodes[root].children.each { |child|
170
118
  helper.call(child.name, chain + [root])
171
119
  }
172
120
  }
173
121
  helper.call(name, [])
122
+ nil
174
123
  end
175
124
 
176
125
  #
@@ -178,18 +127,23 @@ module Rake::CompTree
178
127
  #
179
128
  # Arguments:
180
129
  #
181
- # +name+ -- (Symbol) node name.
130
+ # +name+ -- unique node identifier (usually a symbol).
182
131
  #
183
132
  # +threads+ -- (Integer) number of threads.
184
133
  #
185
- def compute(name, threads)
134
+ # compute(:volume, :threads => 4) syntax is also accepted.
135
+ #
136
+ def compute(name, opts)
137
+ threads = (opts.respond_to?(:to_i) ? opts : opts[:threads]).to_i
186
138
  root = @nodes[name]
187
139
 
188
140
  if threads < 1
189
- raise Error::ArgumentError, "threads is #{threads}"
141
+ raise ArgumentError, "threads is #{threads}"
190
142
  end
191
143
 
192
- if threads == 1
144
+ if root.computed
145
+ root.result
146
+ elsif threads == 1
193
147
  root.result = root.compute_now
194
148
  else
195
149
  compute_multithreaded(root, threads)
@@ -1,28 +1,23 @@
1
1
 
2
2
  module Rake end
3
3
  module Rake::CompTree
4
- module Error
5
- # Base class for CompTree errors.
6
- class Base < StandardError ; end
4
+ # Base class for CompTree errors.
5
+ class Error < StandardError ; end
7
6
 
8
- # Internal error inside CompTree. Please send a bug report.
9
- class AssertionFailed < Base ; end
10
-
11
- # Bad arguments were passed to a method.
12
- class ArgumentError < Base ; end
13
-
14
- #
15
- # Attempt to redefine a Node.
16
- #
17
- # If you wish to only replace the function, set
18
- # driver.nodes[name].function = some_new_lambda
19
- #
20
- class RedefinitionError < Base ; end
21
-
22
- # A Cyclic graph was detected.
23
- class CircularError < Base ; end
24
-
25
- # No function was defined for this node.
26
- class NoFunctionError < Base ; end
27
- end
7
+ # Internal error inside CompTree. Please send a bug report.
8
+ class AssertionFailedError < Error ; end
9
+
10
+ # Bad arguments were passed to a method.
11
+ class ArgumentError < Error ; end
12
+
13
+ #
14
+ # Attempt to redefine a Node.
15
+ #
16
+ # If you wish to only replace the function, set
17
+ # driver.nodes[name].function = some_new_lambda
18
+ #
19
+ class RedefinitionError < Error ; end
20
+
21
+ # No function was defined for this node.
22
+ class NoFunctionError < Error ; end
28
23
  end
@@ -13,6 +13,7 @@ module Rake::CompTree
13
13
  attr_accessor :children #:nodoc:
14
14
  attr_accessor :function #:nodoc:
15
15
  attr_accessor :result #:nodoc:
16
+ attr_accessor :computed #:nodoc:
16
17
  attr_accessor :shared_lock #:nodoc:
17
18
 
18
19
  #
@@ -23,6 +24,7 @@ module Rake::CompTree
23
24
  @mutex = Mutex.new
24
25
  @children = []
25
26
  @parents = []
27
+ @function = nil
26
28
  reset_self
27
29
  end
28
30
 
@@ -33,6 +35,7 @@ module Rake::CompTree
33
35
  @shared_lock = 0
34
36
  @children_results = nil
35
37
  @result = nil
38
+ @computed = nil
36
39
  end
37
40
 
38
41
  #
@@ -81,14 +84,18 @@ module Rake::CompTree
81
84
  # If all children have been computed, return their results;
82
85
  # otherwise return nil.
83
86
  #
87
+ # Do not assign to @children_results since own lock is not
88
+ # necessarily aquired.
89
+ #
84
90
  def find_children_results #:nodoc:
85
- if @children_results
86
- @children_results
87
- else
91
+ @children_results or (
88
92
  @children.map { |child|
89
- child.result or return nil
93
+ unless child.computed
94
+ return nil
95
+ end
96
+ child.result
90
97
  }
91
- end
98
+ )
92
99
  end
93
100
 
94
101
  def children_results=(value) #:nodoc:
@@ -99,9 +106,9 @@ module Rake::CompTree
99
106
  # debug {
100
107
  # # --- own mutex
101
108
  # trace "Computing #{@name}"
102
- # raise Error::AssertionFailed if @result
103
- # raise Error::AssertionFailed unless @mutex.locked?
104
- # raise Error::AssertionFailed unless @children_results
109
+ # raise AssertionFailedError if @computed
110
+ # raise AssertionFailedError unless @mutex.locked?
111
+ # raise AssertionFailedError unless @children_results
105
112
  # }
106
113
  #end
107
114
 
@@ -110,11 +117,17 @@ module Rake::CompTree
110
117
  # already acquired.
111
118
  #
112
119
  def compute #:nodoc:
113
- unless defined?(@function) and @function
114
- raise Error::NoFunctionError,
120
+ begin
121
+ unless @function
122
+ raise NoFunctionError,
115
123
  "No function was defined for node '#{@name.inspect}'"
124
+ end
125
+ @result = @function.call(*@children_results)
126
+ @computed = true
127
+ rescue Exception => e
128
+ @computed = e
116
129
  end
117
- @function.call(*@children_results)
130
+ @result
118
131
  end
119
132
 
120
133
  def try_lock #:nodoc:
@@ -134,7 +147,7 @@ module Rake::CompTree
134
147
  def unlock #:nodoc:
135
148
  # --- shared tree mutex and own mutex
136
149
  #debug {
137
- # raise Error::AssertionFailed unless @mutex.locked?
150
+ # raise AssertionFailedError unless @mutex.locked?
138
151
  # trace "Unlocking #{@name}"
139
152
  #}
140
153
  each_upward { |node|
data/lib/rake/parallel.rb CHANGED
@@ -1,28 +1,23 @@
1
1
 
2
- module Rake ; end
3
-
4
- require 'rake/comp_tree/driver'
2
+ require 'rake/comp_tree/comp_tree'
5
3
 
6
4
  module Rake
7
5
  module TaskManager
8
6
  def invoke_parallel(root_task_name) # :nodoc:
9
- CompTree::Driver.new { |driver|
7
+ CompTree.build do |driver|
10
8
  #
11
9
  # Build the computation tree from task prereqs.
12
10
  #
13
- parallel_tasks.each_pair { |task_name, cache|
11
+ self.parallel.tasks.each_pair { |task_name, cache|
14
12
  task = self[task_name]
15
13
  task_args, prereqs = cache
16
- children_names = prereqs.map { |child|
17
- child.name.to_sym
18
- }
19
- driver.define(task_name.to_sym, *children_names) {
14
+ children_names = prereqs.map { |child| child.name }
15
+ driver.define(task_name, *children_names) {
20
16
  task.execute(task_args)
21
- true
22
17
  }
23
18
  }
24
19
 
25
- root_node = driver.nodes[root_task_name.to_sym]
20
+ root_node = driver.nodes[root_task_name]
26
21
 
27
22
  #
28
23
  # If there were nothing to do, there would be no root node.
@@ -33,16 +28,16 @@ module Rake
33
28
  #
34
29
  root_node.each_downward { |node|
35
30
  unless node.function
36
- node.result = true
31
+ node.computed = true
37
32
  end
38
33
  }
39
34
 
40
35
  #
41
36
  # Launch the computation.
42
37
  #
43
- driver.compute(root_node.name, num_threads)
38
+ driver.compute(root_node.name, self.num_threads)
44
39
  end
45
- }
40
+ end
46
41
  end
47
42
  end
48
43
  end
File without changes
data/test/parallel.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  require 'rake'
2
2
  Rake.application.num_threads = 8
3
+ puts "- Testing multi-threaded"
3
4
 
data/test/shellcommand.rb CHANGED
File without changes
@@ -1,2 +1,3 @@
1
1
  require 'rake'
2
2
  Rake.application.num_threads = 1
3
+ puts "- Testing single-threaded"
@@ -2,9 +2,28 @@
2
2
  require 'rbconfig'
3
3
  require 'test/unit'
4
4
 
5
+ PARALLEL_TEST_MESSAGE = <<'EOS'
6
+
7
+
8
+ Task graph for sample parallel execution:
9
+
10
+ default
11
+ / \
12
+ / \
13
+ a b
14
+ / \
15
+ / \
16
+ x y
17
+
18
+ EOS
19
+
5
20
  if Rake.application.num_threads > 1
6
21
  class TestSimpleParallel < Test::Unit::TestCase
7
- def test_1
22
+ def setup
23
+ puts PARALLEL_TEST_MESSAGE
24
+ end
25
+
26
+ def test_parallel
8
27
  here = File.dirname(__FILE__)
9
28
  rake = File.expand_path("#{here}/../bin/rake")
10
29
 
@@ -18,15 +37,17 @@ if Rake.application.num_threads > 1
18
37
  lib
19
38
  end
20
39
  }.call
21
-
40
+
22
41
  [
23
- "Rakefile.simple",
24
- "Rakefile.seq",
25
- ].each { |file|
42
+ ["Rakefile.simple", true],
43
+ ["Rakefile.seq", false],
44
+ ].each { |file, disp|
26
45
  (1..5).each { |n|
27
- args = [rake, "--threads", n.to_s, "-f", "test/#{file}"]
28
- puts("\n" + "-"*40)
29
- puts(args.join(" "))
46
+ args = [rake, "--threads", n.to_s, "-s", "-f", "test/#{file}"]
47
+ if disp
48
+ puts "\nvisual check: #{n} thread#{n > 1 ? 's' : ''}"
49
+ puts args.join(" ")
50
+ end
30
51
  assert(ruby(*args))
31
52
  }
32
53
  }
@@ -33,14 +33,10 @@ class TestTopLevelFunctions < Test::Unit::TestCase
33
33
  end
34
34
 
35
35
  def test_import
36
- if defined?(RUBY_ENGINE) and RUBY_ENGINE == "jruby"
37
- puts "NOTE: skipping 'import' test for jruby"
38
- else
39
- Rake.application.should_receive(:add_import).with("x").once.ordered
40
- Rake.application.should_receive(:add_import).with("y").once.ordered
41
- Rake.application.should_receive(:add_import).with("z").once.ordered
42
- import('x', 'y', 'z')
43
- end
36
+ Rake.application.should_receive(:add_import).with("x").once.ordered
37
+ Rake.application.should_receive(:add_import).with("y").once.ordered
38
+ Rake.application.should_receive(:add_import).with("z").once.ordered
39
+ import('x', 'y', 'z')
44
40
  end
45
41
 
46
42
  def test_when_writing
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: drake
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.4.1.0.18
4
+ version: 0.8.4.1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James M. Lawrence
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-04-02 00:00:00 -04:00
12
+ date: 2009-04-09 00:00:00 -04:00
13
13
  default_executable: drake
14
14
  dependencies: []
15
15
 
@@ -56,6 +56,11 @@ files:
56
56
  - lib/rake/alt_system.rb
57
57
  - lib/rake/classic_namespace.rb
58
58
  - lib/rake/clean.rb
59
+ - lib/rake/comp_tree/algorithm.rb
60
+ - lib/rake/comp_tree/comp_tree.rb
61
+ - lib/rake/comp_tree/driver.rb
62
+ - lib/rake/comp_tree/error.rb
63
+ - lib/rake/comp_tree/node.rb
59
64
  - lib/rake/contrib/compositepublisher.rb
60
65
  - lib/rake/contrib/ftptools.rb
61
66
  - lib/rake/contrib/publisher.rb
@@ -74,11 +79,6 @@ files:
74
79
  - lib/rake/testtask.rb
75
80
  - lib/rake/win32.rb
76
81
  - lib/rake.rb
77
- - lib/rake/comp_tree/algorithm.rb
78
- - lib/rake/comp_tree/diagnostic.rb
79
- - lib/rake/comp_tree/driver.rb
80
- - lib/rake/comp_tree/error.rb
81
- - lib/rake/comp_tree/node.rb
82
82
  - test/capture_stdout.rb
83
83
  - test/check_expansion.rb
84
84
  - test/check_no_expansion.rb
@@ -1,38 +0,0 @@
1
-
2
- module Rake end
3
- module Rake::CompTree
4
- module Diagnostic
5
- module_function
6
-
7
- def show(desc = nil, stream = STDOUT, &block)
8
- if desc
9
- stream.puts(desc)
10
- end
11
- if block
12
- expression = block.call
13
- result = eval(expression, block.binding)
14
- stream.printf("%-16s => %s\n", expression, result.inspect)
15
- result
16
- end
17
- end
18
-
19
- if $DEBUG
20
- def debug
21
- yield
22
- end
23
-
24
- def debugging?
25
- true
26
- end
27
-
28
- def trace(desc = nil, &block)
29
- show(desc, STDERR, &block)
30
- end
31
- else
32
- def debug ; end
33
- def debugging? ; end
34
- def trace(*args) ; end
35
- end
36
- end
37
- end
38
-