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