Class: Vivarium::MapStore

Inherits:
Object
  • Object
show all
Defined in:
lib/vivarium.rb

Instance Method Summary collapse

Constructor Details

#initialize(pin_dir: Vivarium.bpf_pin_dir) ⇒ MapStore

Returns a new instance of MapStore.



62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
# File 'lib/vivarium.rb', line 62

def initialize(pin_dir: Vivarium.bpf_pin_dir)
  @pin_dir = pin_dir
  @config_root_targets = RbBCC::HashTable.from_pin(
    File.join(@pin_dir, "config_root_targets"),
    "unsigned int",
    "unsigned char",
    keysize: 4,
    leafsize: 1
  )
  @config_spawned_targets = RbBCC::HashTable.from_pin(
    File.join(@pin_dir, "config_spawned_targets"),
    "unsigned int",
    "unsigned char",
    keysize: 4,
    leafsize: 1
  )
  @event_invoked = RbBCC::ArrayTable.from_pin(
    File.join(@pin_dir, "event_invoked"),
    "unsigned int",
    "char[#{EVENT_STRUCT_SIZE}]",
    keysize: 4,
    leafsize: EVENT_STRUCT_SIZE
  )
  @event_write_pos = RbBCC::ArrayTable.from_pin(
    File.join(@pin_dir, "event_write_pos"),
    "unsigned int",
    "unsigned int",
    keysize: 4,
    leafsize: 4
  )
rescue StandardError => e
  raise Error, "failed to open pinned maps under #{@pin_dir}: #{e.class}: #{e.message}"
end

Instance Method Details

#drain_eventsObject



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# File 'lib/vivarium.rb', line 107

def drain_events
  events = []
  EVENT_CAPACITY.times do |idx|
    ptr = @event_invoked[idx]
    next unless ptr

    event = Event.from_binary(ptr[0, EVENT_STRUCT_SIZE])
    next if event.empty?

    events << event
    @event_invoked[idx] = zeroed_event_ptr
  end

  @event_write_pos[0] = 0
  events
end

#register_pid(pid) ⇒ Object



96
97
98
# File 'lib/vivarium.rb', line 96

def register_pid(pid)
  @config_root_targets[pid] = 1
end

#unregister_pid(pid) ⇒ Object



100
101
102
103
104
105
# File 'lib/vivarium.rb', line 100

def unregister_pid(pid)
  @config_root_targets.delete(pid)
  @config_spawned_targets.clear
rescue KeyError
  nil
end