Class: OmfCommon::Eventloop

Inherits:
Object
  • Object
show all
Defined in:
lib/omf_common/eventloop.rb,
lib/omf_common/eventloop/em.rb,
lib/omf_common/eventloop/local_evl.rb

Overview

Providing event loop support.

Direct Known Subclasses

EventMachine, Local

Defined Under Namespace

Classes: EventMachine, Local

Constant Summary collapse

@@providers =
{
  em: {
    require: 'omf_common/eventloop/em',
    constructor: 'OmfCommon::Eventloop::EventMachine'
  },
  local: {
    require: 'omf_common/eventloop/local_evl',
    constructor: 'OmfCommon::Eventloop::Local'
  }
}
@@instance =
nil
@@on_stop_proc =
[]

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.init(opts, &block) ⇒ Object

opts:

:type - eventloop provider
:provider - custom provider (opts)
  :require - gem to load first (opts)
  :constructor - Class implementing provider


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/omf_common/eventloop.rb', line 30

def self.init(opts, &block)
  if @@instance
    raise "Eventloop provider already iniitalised"
  end
  unless provider = opts[:provider]
    provider = @@providers[opts[:type].to_sym]
  end
  unless provider
    raise "Missing Eventloop provider declaration. Either define 'type' or 'provider'"
  end

  require provider[:require] if provider[:require]

  if class_name = provider[:constructor]
    provider_class = class_name.split('::').inject(Object) {|c,n| c.const_get(n) }
    inst = provider_class.new(opts, &block)
  else
    raise "Missing provider creation info - :constructor"
  end
  @@instance = inst
  inst
end

.instanceObject



53
54
55
# File 'lib/omf_common/eventloop.rb', line 53

def self.instance
  @@instance
end

Instance Method Details

#after(delay_sec, &block) ⇒ Object

Execute block after some time

Parameters:

  • delay_sec (Float)

    in sec



61
62
63
# File 'lib/omf_common/eventloop.rb', line 61

def after(delay_sec, &block)
  raise "Missing implementation 'after'"
end

#defer(&block) ⇒ Object

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



75
76
77
# File 'lib/omf_common/eventloop.rb', line 75

def defer(&block)
  raise "Missing implementation 'defer'"
end

#every(interval_sec, &block) ⇒ Object

Periodically call block every interval_sec

Parameters:

  • interval_sec (Float)

    in sec



69
70
71
# File 'lib/omf_common/eventloop.rb', line 69

def every(interval_sec, &block)
  raise "Missing implementation 'every'"
end

#joinObject

Block calling thread until eventloop exits



80
81
82
# File 'lib/omf_common/eventloop.rb', line 80

def join()
  raise "Missing implementation 'join'"
end

#on_int_signal(&block) ⇒ Object

Calling ‘block’ when having trapped an INT signal



107
108
109
110
# File 'lib/omf_common/eventloop.rb', line 107

def on_int_signal(&block)
  # trap(:INT)
  warn "Missing implementation 'on_int_signal'"
end

#on_stop(&block) ⇒ Object

Calling ‘block’ before stopping eventloop



101
102
103
# File 'lib/omf_common/eventloop.rb', line 101

def on_stop(&block)
  @@on_stop_proc << block
end

#on_term_signal(&block) ⇒ Object

Calling ‘block’ when having trapped a TERM signal



114
115
116
117
# File 'lib/omf_common/eventloop.rb', line 114

def on_term_signal(&block)
  # trap(:TERM) {}
  warn "Missing implementation 'on_term_signal'"
end

#runObject



84
85
86
# File 'lib/omf_common/eventloop.rb', line 84

def run()
  raise "Missing implementation 'run'"
end

#stopObject



88
89
90
91
92
93
94
95
96
97
# File 'lib/omf_common/eventloop.rb', line 88

def stop()
  @@on_stop_proc.each do |block|
    begin
      block.call()
    rescue  => ex
      error "Exception '#{ex}'"
      debug "#{ex}\n\t#{ex.backtrace.join("\n\t")}"
    end
  end
end