Module: Pwrake::TaskAlgorithm

Included in:
Rake::Task
Defined in:
lib/pwrake/task/task_algorithm.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#argumentsObject (readonly)

Returns the value of attribute arguments.



9
10
11
# File 'lib/pwrake/task/task_algorithm.rb', line 9

def arguments
  @arguments
end

#propertyObject (readonly)

Returns the value of attribute property.



10
11
12
# File 'lib/pwrake/task/task_algorithm.rb', line 10

def property
  @property
end

#subsequentsObject (readonly)

Returns the value of attribute subsequents.



8
9
10
# File 'lib/pwrake/task/task_algorithm.rb', line 8

def subsequents
  @subsequents
end

#unfinished_prereqObject (readonly)

Returns the value of attribute unfinished_prereq.



11
12
13
# File 'lib/pwrake/task/task_algorithm.rb', line 11

def unfinished_prereq
  @unfinished_prereq
end

Instance Method Details

#check_prereq_finished(preq_name = nil) ⇒ Object



98
99
100
101
# File 'lib/pwrake/task/task_algorithm.rb', line 98

def check_prereq_finished(preq_name=nil)
  @unfinished_prereq.delete(preq_name)
  !@already_finished && @unfinished_prereq.empty?
end

#pw_enq_subsequentsObject



88
89
90
91
92
93
94
95
96
# File 'lib/pwrake/task/task_algorithm.rb', line 88

def pw_enq_subsequents
  # not synchronize owing to fiber
  @subsequents.each do |t|        # <<--- competition !!!
    if t && t.check_prereq_finished(self.name)
      application.task_queue.enq(t.wrapper)
    end
  end
  @already_finished = true        # <<--- competition !!!
end

#pw_search_tasks(args) ⇒ Object



20
21
22
23
24
25
26
27
28
29
# File 'lib/pwrake/task/task_algorithm.rb', line 20

def pw_search_tasks(args)
  Log.debug "#{self.class}#pw_search_tasks start, task=#{name} args=#{args.inspect}"
  cl = Pwrake.clock
  TaskWrapper.clear_rank
  task_args = TaskArguments.new(arg_names, args)
  # not synchronize owing to fiber
  search_with_call_chain(nil, task_args, InvocationChain::EMPTY)
  #
  Log.debug "#{self.class}#pw_search_tasks end #{Pwrake.clock-cl}"
end

#pw_set_property(property) ⇒ Object



103
104
105
106
107
108
109
110
# File 'lib/pwrake/task/task_algorithm.rb', line 103

def pw_set_property(property)
  if @property
    @property.merge(property)
  else
    @property = property
  end
  self
end

#search_prerequisites(task_args, invocation_chain) ⇒ Object

Search all the prerequisites of a task.



67
68
69
70
71
72
73
74
75
76
# File 'lib/pwrake/task/task_algorithm.rb', line 67

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.



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
60
61
62
63
64
# File 'lib/pwrake/task/task_algorithm.rb', line 33

def search_with_call_chain(subseq, task_args, invocation_chain) # :nodoc:
  new_chain = InvocationChain.append(self, invocation_chain)
  @lock.synchronize do
    if application.options.trace
      #Log.debug "** 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 !@already_finished && @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

#wrapperObject



13
14
15
16
17
18
# File 'lib/pwrake/task/task_algorithm.rb', line 13

def wrapper
  if @wrapper.nil?
    raise "TaskWrapper is not defined for #{self.class}[#{name}]"
  end
  @wrapper
end