Class: Vivarium::Correlator
- Inherits:
-
Object
- Object
- Vivarium::Correlator
- Defined in:
- lib/vivarium/correlator.rb
Defined Under Namespace
Classes: RawEvent
Constant Summary collapse
- EVENT_C_TYPE =
<<~C struct event_t { u64 ktime_ns; u32 pid; u32 tid; char event_name[16]; char payload[256]; }; C
- POLL_TIMEOUT_MS =
200
Instance Method Summary collapse
-
#initialize(pin_dir:, observer_pid:, main_tid:, method_id_queue:, dest: $stdout) ⇒ Correlator
constructor
A new instance of Correlator.
- #start ⇒ Object
- #stop ⇒ Object
Constructor Details
#initialize(pin_dir:, observer_pid:, main_tid:, method_id_queue:, dest: $stdout) ⇒ Correlator
Returns a new instance of Correlator.
25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
# File 'lib/vivarium/correlator.rb', line 25 def initialize(pin_dir:, observer_pid:, main_tid:, method_id_queue:, dest: $stdout) @pin_dir = pin_dir @observer_pid = observer_pid @main_tid = main_tid @method_id_queue = method_id_queue @dest = dest @events = [] @events_mutex = Mutex.new @method_table = {} @stop_flag = false @started = false @ringbuf = RbBCC::RingBuf.from_pin( File.join(@pin_dir, "events"), EVENT_C_TYPE, Vivarium::EVENTS_RINGBUF_PAGES ) @ringbuf.open_ring_buffer do |_ctx, data, size| capture_event(data, size) end end |
Instance Method Details
#start ⇒ Object
48 49 50 51 52 53 54 55 |
# File 'lib/vivarium/correlator.rb', line 48 def start return if @started @session_start_iso = Time.now.utc.iso8601(3) @session_start_ktime = Vivarium.monotonic_ktime_ns @thread = Thread.new { run } @started = true end |
#stop ⇒ Object
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
# File 'lib/vivarium/correlator.rb', line 57 def stop return unless @started return if @stopped @stop_flag = true @thread&.join(POLL_TIMEOUT_MS * 4 / 1000.0 + 1) @session_stop_iso = Time.now.utc.iso8601(3) @session_stop_ktime = Vivarium.monotonic_ktime_ns 3.times { safe_poll(50) } drain_method_id_queue events_snapshot = @events_mutex.synchronize { @events.dup } method_table_snapshot = @method_table.dup @stopped = true TreeRenderer.new( events: events_snapshot, method_table: method_table_snapshot, observer_pid: @observer_pid, main_tid: @main_tid, session_start_iso: @session_start_iso, session_start_ktime: @session_start_ktime, session_stop_iso: @session_stop_iso, session_stop_ktime: @session_stop_ktime, dest: @dest ).render end |