Module: Ibex::Runtime::Observation
- Included in:
- Parser
- Defined in:
- lib/ibex/runtime/observation.rb,
sig/ibex/runtime/observation.rbs
Overview
Registration and ordered synchronous dispatch for parser observers.
Defined Under Namespace
Classes: Subscription
Instance Method Summary collapse
- #emit_runtime_event(type, data, observers: runtime_observer_snapshot) ⇒ void
- #ensure_observation_thread! ⇒ void
- #observe {|arg0| ... } ⇒ Subscription
- #runtime_observer_snapshot ⇒ Array[Proc]?
- #unobserve(subscription) ⇒ Boolean
Instance Method Details
#emit_runtime_event(type, data, observers: runtime_observer_snapshot) ⇒ void
This method returns an undefined value.
61 62 63 64 65 66 67 |
# File 'lib/ibex/runtime/observation.rb', line 61 def emit_runtime_event(type, data, observers: runtime_observer_snapshot) return unless observers @runtime_event_sequence += 1 event = Event.new(type: type, sequence: @runtime_event_sequence, data: data) observers.each { |observer| observer.call(event) } end |
#ensure_observation_thread! ⇒ void
This method returns an undefined value.
75 76 77 78 79 |
# File 'lib/ibex/runtime/observation.rb', line 75 def ensure_observation_thread! return if @driver_status == :idle || @runtime_driver_thread == Thread.current raise ThreadError, "parser observers cannot be changed from another thread while a driver is active" end |
#observe {|arg0| ... } ⇒ Subscription
30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/ibex/runtime/observation.rb', line 30 def observe(&observer) __send__(:ensure_runtime_initialized!) raise ArgumentError, "observe requires a block" unless observer @runtime_observation_mutex.synchronize do ensure_observation_thread! @runtime_fast_path = false subscription = Subscription.__send__(:new) @runtime_observers ||= {} #: Hash[Subscription, Proc] @runtime_observers[subscription] = observer subscription end end |
#runtime_observer_snapshot ⇒ Array[Proc]?
70 71 72 |
# File 'lib/ibex/runtime/observation.rb', line 70 def runtime_observer_snapshot @runtime_observers&.values end |
#unobserve(subscription) ⇒ Boolean
45 46 47 48 49 50 51 52 53 54 55 56 |
# File 'lib/ibex/runtime/observation.rb', line 45 def unobserve(subscription) __send__(:ensure_runtime_initialized!) @runtime_observation_mutex.synchronize do ensure_observation_thread! observers = @runtime_observers next false unless observers removed = !observers.delete(subscription).nil? @runtime_observers = nil if observers.empty? removed end end |