Class: BitGirder::Event::Logger::Engine
- Inherits:
-
BitGirderClass
- Object
- BitGirderClass
- BitGirder::Event::Logger::Engine
- Defined in:
- lib/bitgirder/event/logger.rb
Overview
An Engine coordinates dispatching of logged events a dynamic set of listeners. All methods are safe to call from concurrent threads.
Instance Method Summary collapse
- #add_listener(l) ⇒ Object
-
#impl_initialize ⇒ Object
Creates a new instance with an empty listener set.
- #listener_count ⇒ Object
- #log_event(ev) ⇒ Object
- #remove_listener(l) ⇒ Object
Instance Method Details
#add_listener(l) ⇒ Object
114 115 116 117 118 119 120 121 122 123 124 125 |
# File 'lib/bitgirder/event/logger.rb', line 114 def add_listener( l ) guarded do if l.respond_to?( :event_logged ) @listeners << l unless @listeners.include?( l ) else raise "Not an event listener: #{l} (#{l.class})" end end l end |
#impl_initialize ⇒ Object
Creates a new instance with an empty listener set.
49 50 51 52 53 54 55 |
# File 'lib/bitgirder/event/logger.rb', line 49 def impl_initialize # :nodoc: super @listeners = Set.new @mut = Mutex.new end |
#listener_count ⇒ Object
68 69 70 |
# File 'lib/bitgirder/event/logger.rb', line 68 def listener_count guarded { @listeners.size } end |
#log_event(ev) ⇒ Object
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'lib/bitgirder/event/logger.rb', line 85 def log_event( ev ) # Accumulate failures here so we can process them after releasing the # lock failures = [] guarded do @listeners.each do |l| begin l.event_logged( ev ) rescue Exception => ex failures << [ l, ev, ex ] end end end failures.each { |arr| listener_failed( *arr ) } end |
#remove_listener(l) ⇒ Object
130 131 132 |
# File 'lib/bitgirder/event/logger.rb', line 130 def remove_listener( l ) guarded { @listeners.delete( l ) } end |