class Snmp2mkr::EngineThreads::Timer

Constants

Entry

Attributes

entries[R]
logger[R]
thread[R]

Public Class Methods

new(logger: Logger.new($stdout)) click to toggle source
# File lib/snmp2mkr/engine_threads/timer.rb, line 6
def initialize(logger: Logger.new($stdout))
  @shutdown = false
  @entries = []
  @logger = logger
  @thread = nil
end

Public Instance Methods

add(interval, &hook) click to toggle source
# File lib/snmp2mkr/engine_threads/timer.rb, line 15
def add(interval, &hook)
  entry = Entry.new(interval, hook, now - interval + rand(15))
  logger.info "Added timer #{entry.inspect}"
  @entries << entry
end
join() click to toggle source
# File lib/snmp2mkr/engine_threads/timer.rb, line 25
def join
  return unless running?
  @thread.join
end
kick(entry) click to toggle source
# File lib/snmp2mkr/engine_threads/timer.rb, line 61
def kick(entry)
  logger.debug "timer kick entry #{entry.inspect}"
  entry.last = now
  Thread.new do
    begin
      entry.hook.call
    rescue Exception => e
      logger.error "#{e.inspect}\n\t#{e.backtrace.join("\n\t")}"
    end
  end
end
main_loop() click to toggle source
# File lib/snmp2mkr/engine_threads/timer.rb, line 41
def main_loop
  logger.info "timer started"
  loop do
    break if @shutdown
    tick
    sleep 1
  end
  logger.info "timer shutdown"
rescue Exception => e
  logger.error "#{e.inspect}\n\t#{e.backtrace.join("\n\t")}"
  retry
end
running?() click to toggle source
# File lib/snmp2mkr/engine_threads/timer.rb, line 21
def running?
  @thread && @thread.alive?
end
start() click to toggle source
# File lib/snmp2mkr/engine_threads/timer.rb, line 30
def start
  return if running?
  @shutdown = false
  @thread = Thread.new(&method(:main_loop))
end
stop() click to toggle source
# File lib/snmp2mkr/engine_threads/timer.rb, line 36
def stop
  return unless running?
  @shutdown = true
end
tick() click to toggle source
# File lib/snmp2mkr/engine_threads/timer.rb, line 54
def tick
  t = now
  @entries.each do |entry|
    kick(entry) if (now - entry.last) > entry.interval
  end
end

Private Instance Methods

now() click to toggle source
# File lib/snmp2mkr/engine_threads/timer.rb, line 75
def now
  Process.clock_gettime(Process::CLOCK_MONOTONIC)
end