class Rbgo::TaskList

Attributes

last_error[RW]
running[RW]
start_once[RW]
task_queue[RW]
wait_cond[RW]
wait_mutex[RW]

Public Class Methods

new() click to toggle source
# File lib/rbgo/task_list.rb, line 64
def initialize
  self.task_queue = Queue.new
  self.start_once = Once.new
  self.running    = false
  self.wait_mutex = Mutex.new
  self.wait_cond  = ConditionVariable.new
end

Public Instance Methods

<<(task) click to toggle source
# File lib/rbgo/task_list.rb, line 10
def <<(task)
  task_queue << task
  self
end
add(task, timeout: nil, skip_on_exception: false) click to toggle source
# File lib/rbgo/task_list.rb, line 15
def add(task, timeout: nil, skip_on_exception: false)
  task_queue << proc do |last_task_result|
    begin
      Timeout::timeout(timeout) do
        task.call(last_task_result)
      end
    rescue Exception => ex
      self.last_error = ex
      raise unless skip_on_exception
    end
  end
  self
end
clear_task() click to toggle source
# File lib/rbgo/task_list.rb, line 36
def clear_task
  task_queue.clear
end
complete?() click to toggle source
# File lib/rbgo/task_list.rb, line 44
def complete?
  !running? && task_queue.empty?
end
running?() click to toggle source
# File lib/rbgo/task_list.rb, line 40
def running?
  running
end
start(arg = nil) click to toggle source
# File lib/rbgo/task_list.rb, line 29
def start(arg = nil)
  start_once.do do
    _start(arg)
  end
  nil
end
wait(timeout = nil) click to toggle source
# File lib/rbgo/task_list.rb, line 52
def wait(timeout = nil)
  wait_mutex.synchronize do
    if running?
      wait_cond.wait(wait_mutex, timeout)
    end
  end
end
wakeup() click to toggle source
# File lib/rbgo/task_list.rb, line 48
def wakeup
  wait_cond.signal
end

Private Instance Methods

_start(arg = nil) click to toggle source
# File lib/rbgo/task_list.rb, line 79
def _start(arg = nil)
  self.last_error = nil unless running?
  self.running    = true
  go(arg) do |last_task_result|
    begin
      task = task_queue.deq(true)
    rescue ThreadError
      notify
      self.start_once = Once.new
    else
      begin
        res = task.call(last_task_result)
      rescue Exception => ex
        self.last_error = ex
        notify
        self.start_once = Once.new
      else
        _start(res)
      end
    end
  end
end
notify() click to toggle source
# File lib/rbgo/task_list.rb, line 72
def notify
  wait_mutex.synchronize do
    self.running = false
    wait_cond.signal
  end
end