class Dynflow::Clock

Constants

Timer

Public Class Methods

new(logger = nil) click to toggle source
# File lib/dynflow/clock.rb, line 43
def initialize(logger = nil)
  @logger = logger
  @timers = Utils::PriorityQueue.new { |a, b| b <=> a }
end

Public Instance Methods

add_timer(timer) click to toggle source
# File lib/dynflow/clock.rb, line 61
def add_timer(timer)
  @timers.push timer
  if @timers.size == 1
    sleep_to timer
  else
    wakeup if timer == first_timer
  end
end
default_reference_class() click to toggle source
# File lib/dynflow/clock.rb, line 48
def default_reference_class
  ClockReference
end
on_event(event) click to toggle source
# File lib/dynflow/clock.rb, line 52
def on_event(event)
  wakeup if event == :terminated
end
tick() click to toggle source
# File lib/dynflow/clock.rb, line 56
def tick
  run_ready_timers
  sleep_to first_timer
end

Private Instance Methods

first_timer() click to toggle source
# File lib/dynflow/clock.rb, line 83
def first_timer
  @timers.top
end
run_ready_timers() click to toggle source
# File lib/dynflow/clock.rb, line 72
def run_ready_timers
  while first_timer && first_timer.when <= Time.now
    begin
      first_timer.apply
    rescue => e
      @logger && @logger.error("Failed to apply clock event #{first_timer}, exception: #{e}")
    end
    @timers.pop
  end
end
schedule(delay) { || ... } click to toggle source
# File lib/dynflow/clock.rb, line 100
def schedule(delay, &block)
  @timer = if delay.positive?
             Concurrent::ScheduledTask.execute(delay, &block)
           else
             yield
             nil
           end
end
sleep_to(timer) click to toggle source
# File lib/dynflow/clock.rb, line 94
def sleep_to(timer)
  return unless timer
  schedule(timer.when - Time.now) { reference.tell(:tick) unless terminating? }
  nil
end
wakeup() click to toggle source
# File lib/dynflow/clock.rb, line 87
def wakeup
  if @timer
    @timer.cancel
    tick unless terminating?
  end
end