Class: Rake::RemoteTask::Action

Inherits:
Object
  • Object
show all
Defined in:
lib/rake/remote_task.rb

Overview

Action is used to run a task’s remote_actions in parallel on each of its hosts. Actions are created automatically in Rake::RemoteTask#enhance.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(task, block) ⇒ Action

Creates a new Action that will run block for task.



594
595
596
597
598
# File 'lib/rake/remote_task.rb', line 594

def initialize task, block
  @task  = task
  @block = block
  @workers = ThreadGroup.new
end

Instance Attribute Details

#blockObject (readonly)

The block this action will execute.



584
585
586
# File 'lib/rake/remote_task.rb', line 584

def block
  @block
end

#taskObject (readonly)

The task this action is attached to.



579
580
581
# File 'lib/rake/remote_task.rb', line 579

def task
  @task
end

#workersObject (readonly)

An Array of threads, one for each host this action executes on.



589
590
591
# File 'lib/rake/remote_task.rb', line 589

def workers
  @workers
end

Instance Method Details

#==(other) ⇒ Object

:nodoc:



600
601
602
603
# File 'lib/rake/remote_task.rb', line 600

def == other # :nodoc:
  return false unless Action === other
  block == other.block && task == other.task
end

#execute(hosts, task, args) ⇒ Object

Execute this action on hosts in parallel. Returns when block has completed for each host.



609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
# File 'lib/rake/remote_task.rb', line 609

def execute hosts, task, args
  hosts.each do |host|
    t = task.clone
    t.target_host = host
    thread = Thread.new(t) do |task|
      Thread.current[:task] = task
      case block.arity
      when 1
        block.call task
      else
        block.call task, args
      end
      Thread.current[:task] = nil
    end
    @workers.add thread
  end
  @workers.list.each { |thr| thr.join }
end