Class: BitGirder::Event::Logger::Engine

Inherits:
BitGirderClass
  • Object
show all
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

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_initializeObject

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_countObject



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