Module: Pwrake::TaskAlgorithm
- Defined in:
- lib/pwrake/task/task_algorithm.rb
Instance Attribute Summary collapse
-
#arguments ⇒ Object
readonly
Returns the value of attribute arguments.
-
#property ⇒ Object
readonly
Returns the value of attribute property.
-
#subsequents ⇒ Object
readonly
Returns the value of attribute subsequents.
-
#wrapper ⇒ Object
readonly
Returns the value of attribute wrapper.
Instance Method Summary collapse
- #check_prereq_finished(preq_name = nil) ⇒ Object
- #pw_enq_subsequents ⇒ Object
- #pw_search_tasks(args) ⇒ Object
- #pw_set_property(property) ⇒ Object
-
#search_prerequisites(task_args, invocation_chain) ⇒ Object
Search all the prerequisites of a task.
-
#search_with_call_chain(subseq, task_args, invocation_chain) ⇒ Object
Same as search, but explicitly pass a call chain to detect circular dependencies.
Instance Attribute Details
#arguments ⇒ Object (readonly)
Returns the value of attribute arguments.
10 11 12 |
# File 'lib/pwrake/task/task_algorithm.rb', line 10 def arguments @arguments end |
#property ⇒ Object (readonly)
Returns the value of attribute property.
11 12 13 |
# File 'lib/pwrake/task/task_algorithm.rb', line 11 def property @property end |
#subsequents ⇒ Object (readonly)
Returns the value of attribute subsequents.
9 10 11 |
# File 'lib/pwrake/task/task_algorithm.rb', line 9 def subsequents @subsequents end |
#wrapper ⇒ Object (readonly)
Returns the value of attribute wrapper.
8 9 10 |
# File 'lib/pwrake/task/task_algorithm.rb', line 8 def wrapper @wrapper end |
Instance Method Details
#check_prereq_finished(preq_name = nil) ⇒ Object
96 97 98 99 |
# File 'lib/pwrake/task/task_algorithm.rb', line 96 def check_prereq_finished(preq_name=nil) @unfinished_prereq.delete(preq_name) @unfinished_prereq.empty? end |
#pw_enq_subsequents ⇒ Object
83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/pwrake/task/task_algorithm.rb', line 83 def pw_enq_subsequents t = Time.now #h = application.pwrake_options['HALT_QUEUE_WHILE_SEARCH'] #application.task_queue.synchronize(h) do @subsequents.each do |t| # <<--- competition !!! if t && t.check_prereq_finished(self.name) application.task_queue.enq(t.wrapper) end end #end @already_finished = true # <<--- competition !!! end |
#pw_search_tasks(args) ⇒ Object
13 14 15 16 17 18 19 20 21 22 23 24 |
# File 'lib/pwrake/task/task_algorithm.rb', line 13 def pw_search_tasks(args) Log.debug "#{self.class}#pw_search_tasks start, args=#{args.inspect}" tm = Time.now task_args = TaskArguments.new(arg_names, args) #timer = Timer.new("search_task") #h = application.pwrake_options['HALT_QUEUE_WHILE_SEARCH'] #application.task_queue.synchronize(h) do search_with_call_chain(nil, task_args, InvocationChain::EMPTY) #end #timer.finish Log.debug "#{self.class}#pw_search_tasks end #{Time.now-tm}" end |
#pw_set_property(property) ⇒ Object
101 102 103 104 |
# File 'lib/pwrake/task/task_algorithm.rb', line 101 def pw_set_property(property) @property = property self end |
#search_prerequisites(task_args, invocation_chain) ⇒ Object
Search all the prerequisites of a task.
62 63 64 65 66 67 68 69 70 71 |
# File 'lib/pwrake/task/task_algorithm.rb', line 62 def search_prerequisites(task_args, invocation_chain) # :nodoc: @unfinished_prereq = {} @prerequisites.each{|t| @unfinished_prereq[t]=true} prerequisite_tasks.each { |prereq| prereq_args = task_args.new_scope(prereq.arg_names) if prereq.search_with_call_chain(self, prereq_args, invocation_chain) @unfinished_prereq.delete(prereq.name) end } end |
#search_with_call_chain(subseq, task_args, invocation_chain) ⇒ Object
Same as search, but explicitly pass a call chain to detect circular dependencies.
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
# File 'lib/pwrake/task/task_algorithm.rb', line 28 def search_with_call_chain(subseq, task_args, invocation_chain) # :nodoc: new_chain = InvocationChain.append(self, invocation_chain) @lock.synchronize do if application..trace #Log.info "** Search #{name} #{format_search_flags}" application.trace "** Search #{name} #{format_search_flags}" end return true if @already_finished # <<--- competition !!! @subsequents ||= [] @subsequents << subseq if subseq # <<--- competition !!! if ! @already_searched @already_searched = true @arguments = task_args @wrapper = TaskWrapper.new(self,task_args) if @prerequisites.empty? @unfinished_prereq = {} else search_prerequisites(task_args, new_chain) end #check_and_enq if @unfinished_prereq.empty? application.task_queue.enq(@wrapper) end end return false end rescue Exception => ex add_chain_to(ex, new_chain) raise ex end |