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