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