Class: Vivarium::MapStore

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

Instance Method Summary collapse

Constructor Details

#initialize(pin_dir: PIN_DIR) ⇒ MapStore

Returns a new instance of MapStore.



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'lib/vivarium.rb', line 41

def initialize(pin_dir: PIN_DIR)
  @pin_dir = pin_dir
  @config_targets = RbBCC::HashTable.from_pin(
    File.join(@pin_dir, "config_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



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/vivarium.rb', line 78

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



68
69
70
# File 'lib/vivarium.rb', line 68

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

#unregister_pid(pid) ⇒ Object



72
73
74
75
76
# File 'lib/vivarium.rb', line 72

def unregister_pid(pid)
  @config_targets.delete(pid)
rescue KeyError
  nil
end