Class: Vivarium::Correlator

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

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

#startObject



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

#stopObject



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