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.



389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
# File 'lib/vivarium.rb', line 389

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



434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
# File 'lib/vivarium.rb', line 434

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



423
424
425
# File 'lib/vivarium.rb', line 423

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

#unregister_pid(pid) ⇒ Object



427
428
429
430
431
432
# File 'lib/vivarium.rb', line 427

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