class OmfCommon::Eventloop::EventMachine

Implements a simple eventloop which only deals with timer events

Public Class Methods

new(opts = {}, &block) click to toggle source
Calls superclass method OmfCommon::Eventloop::new
# File lib/omf_common/eventloop/em.rb, line 14
def initialize(opts = {}, &block)
  super
  @deferred =  []
  @deferred << block if block
end

Public Instance Methods

after(delay_sec, &block) click to toggle source

Execute block after some time

@param [Float] delay_sec in sec

# File lib/omf_common/eventloop/em.rb, line 23
def after(delay_sec, &block)
  if EM.reactor_running?
    EM.add_timer(delay_sec) do
      begin
        block.call()
      rescue  => ex
        error "Exception '#{ex}'"
        debug "#{ex}\n\t#{ex.backtrace.join("\n\t")}"
      end
    end
  else
    @deferred << lambda do
      after(delay_sec, &block)
    end
  end
end
defer(&block) click to toggle source

Call ‘block’ in the context of a separate thread.

# File lib/omf_common/eventloop/em.rb, line 42
def defer(&block)
  raise "Can't handle 'defer' registration before the EM is up" unless EM.reactor_running?
  EM.defer do
    begin
      block.call()
    rescue  => ex
      error "Exception '#{ex}'"
      debug "#{ex}\n\t#{ex.backtrace.join("\n\t")}"
    end
  end
end
every(interval_sec, &block) click to toggle source

Periodically call block every interval_sec

@param [Float] interval_sec in sec

# File lib/omf_common/eventloop/em.rb, line 57
def every(interval_sec, &block)
  # to allow canceling the periodic timer we need to
  # hand back a reference to it which responds to 'cancel'
  # As this is getting rather complex when allowing for
  # registration before the EM is up and running, we simply throw
  # and exception at this time.
  raise "Can't handle 'every' registration before the EM is up" unless EM.reactor_running?
  # if EM.reactor_running?
    # EM.add_periodic_timer(interval_sec, &block)
  # else
    # @deferred << lambda do
      # EM.add_periodic_timer(interval_sec, &block)
    # end
  # end
  t = EM.add_periodic_timer(interval_sec) do
    begin
      block.call(t)
    rescue  => ex
      error "Exception '#{ex}'"
      debug "#{ex}\n\t#{ex.backtrace.join("\n\t")}"
    end
  end
  t
end
run(&block) click to toggle source
# File lib/omf_common/eventloop/em.rb, line 82
def run(&block)
  EM.run do
    @deferred.each { |proc| proc.call }
    @deferred = nil
    if block
      begin
        block.arity == 0 ? block.call : block.call(self)
      rescue  => ex
        error "While executing run block - #{ex}"
        error ex.backtrace.join("\n\t")
      end
    end
  end
end
stop() click to toggle source
Calls superclass method OmfCommon::Eventloop#stop
# File lib/omf_common/eventloop/em.rb, line 97
def stop()
  super
  EM.next_tick { EM.stop }
end