Class: RbBCC::TableBase

Inherits:
Object
  • Object
show all
Includes:
Enumerable, Fiddle::Importer, CPUHelper
Defined in:
lib/rbbcc/table.rb

Direct Known Subclasses

ArrayTable, HashTable, PerfEventArray, RingBuf, StackTrace

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from CPUHelper

_read_cpu_range, get_online_cpus, get_possible_cpus

Constructor Details

#initialize(bpf, map_id, map_fd, keytype, leaftype, name: nil) ⇒ TableBase

Returns a new instance of TableBase.



118
119
120
121
122
123
124
125
126
# File 'lib/rbbcc/table.rb', line 118

def initialize(bpf, map_id, map_fd, keytype, leaftype, name: nil)
  @bpf, @map_id, @map_fd, @keysize, @leafsize = \
                                    bpf, map_id, map_fd, sizeof(keytype), sizeof(leaftype)
  @keytype = keytype
  @leaftype = leaftype
  @ttype = Clib.bpf_table_type_id(self.bpf.module, self.map_id)
  @flags = Clib.bpf_table_flags_id(self.bpf.module, self.map_id)
  @name = name
end

Instance Attribute Details

#bpfObject (readonly)

Returns the value of attribute bpf.



127
128
129
# File 'lib/rbbcc/table.rb', line 127

def bpf
  @bpf
end

#flagsObject (readonly)

Returns the value of attribute flags.



127
128
129
# File 'lib/rbbcc/table.rb', line 127

def flags
  @flags
end

#keysizeObject (readonly)

Returns the value of attribute keysize.



127
128
129
# File 'lib/rbbcc/table.rb', line 127

def keysize
  @keysize
end

#keytypeObject (readonly)

Returns the value of attribute keytype.



127
128
129
# File 'lib/rbbcc/table.rb', line 127

def keytype
  @keytype
end

#leafsizeObject (readonly)

Returns the value of attribute leafsize.



127
128
129
# File 'lib/rbbcc/table.rb', line 127

def leafsize
  @leafsize
end

#leaftypeObject (readonly)

Returns the value of attribute leaftype.



127
128
129
# File 'lib/rbbcc/table.rb', line 127

def leaftype
  @leaftype
end

#map_fdObject (readonly)

Returns the value of attribute map_fd.



127
128
129
# File 'lib/rbbcc/table.rb', line 127

def map_fd
  @map_fd
end

#map_idObject (readonly)

Returns the value of attribute map_id.



127
128
129
# File 'lib/rbbcc/table.rb', line 127

def map_id
  @map_id
end

#nameObject (readonly)

Returns the value of attribute name.



127
128
129
# File 'lib/rbbcc/table.rb', line 127

def name
  @name
end

#ttypeObject (readonly)

Returns the value of attribute ttype.



127
128
129
# File 'lib/rbbcc/table.rb', line 127

def ttype
  @ttype
end

Instance Method Details

#[](_key) ⇒ Object



150
151
152
153
154
155
156
157
158
159
160
# File 'lib/rbbcc/table.rb', line 150

def [](_key)
  key = normalize_key(_key)

  leaf = Fiddle::Pointer.malloc(self.leafsize)
  res = Clib.bpf_lookup_elem(self.map_fd, key, leaf)
  if res < 0
    nil
  end
  leaf.bcc_value_type = leaftype
  return leaf
end

#[]=(_key, _leaf) ⇒ Object



166
167
168
169
170
171
172
173
174
# File 'lib/rbbcc/table.rb', line 166

def []=(_key, _leaf)
  key = normalize_key(_key)
  leaf = normalize_leaf(_leaf)
  res = Clib.bpf_update_elem(self.map_fd, key, leaf, 0)
  if res < 0
    raise SystemCallError.new("Could not update table", Fiddle.last_error)
  end
  leaf
end

#clearObject



212
213
214
215
# File 'lib/rbbcc/table.rb', line 212

def clear
  each_key {|key| self.delete(key) }
  return items # reload contents
end

#delete(key) ⇒ Object



176
177
178
179
180
181
182
# File 'lib/rbbcc/table.rb', line 176

def delete(key)
  res = Clib.bpf_delete_elem(self.map_fd, key)
  if res < 0
    raise KeyError, "key not found"
  end
  res
end

#each_keyObject



184
185
186
187
188
189
190
191
192
193
# File 'lib/rbbcc/table.rb', line 184

def each_key
  k = nil
  keys = []
  loop do
    k = self.next(k)
    keys << k
    yield k
  end
  keys
end

#each_pairObject Also known as: each



199
200
201
# File 'lib/rbbcc/table.rb', line 199

def each_pair
  each_key {|key| yield(key, self[key]) if self[key] }
end

#each_valueObject



195
196
197
# File 'lib/rbbcc/table.rb', line 195

def each_value
  each_key {|key| yield(self[key]) if self[key] }
end

#fetch(key) ⇒ Object



162
163
164
# File 'lib/rbbcc/table.rb', line 162

def fetch(key)
  self[key] || raise(KeyError, "key not found")
end

#itemsObject



208
209
210
# File 'lib/rbbcc/table.rb', line 208

def items
  enum_for(:each_pair).to_a
end

#next(key) ⇒ Object



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/rbbcc/table.rb', line 129

def next(key)
  next_key = Fiddle::Pointer.malloc(self.keysize)

  if !key
    res = Clib.bpf_get_first_key(self.map_fd, next_key,
                                 next_key.size)
  else
    unless key.is_a?(Fiddle::Pointer)
      raise TypeError, key.inspect
    end
    res = Clib.bpf_get_next_key(self.map_fd, key,
                                next_key)
  end

  if res < 0
    raise StopIteration
  end

  return next_key
end


235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/rbbcc/table.rb', line 235

def print_linear_hist(val_type="value",
                      section_header: "Bucket ptr",
                      section_print_fn: nil,
                      bucket_fn: nil,
                      bucket_sort_fn: nil)
  if structured_key?
    raise NotImplementedError
  else
    vals = Array.new($linear_index_max) { 0 }
    each_pair do |k, v|
      vals[k.to_bcc_value] = v.to_bcc_value
    end
    RbBCC.print_linear_hist(vals, val_type)
  end
  nil
end


217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
# File 'lib/rbbcc/table.rb', line 217

def print_log2_hist(val_type="value",
                    section_header: "Bucket ptr",
                    section_print_fn: nil,
                    bucket_fn: nil,
                    strip_leading_zero: false,
                    bucket_sort_fn: nil)
  if structured_key?
    raise NotImplementedError
  else
    vals = Array.new($log2_index_max) { 0 }
    each_pair do |k, v|
      vals[k.to_bcc_value] = v.to_bcc_value
    end
    RbBCC.print_log2_hist(vals, val_type, strip_leading_zero)
  end
  nil
end

#structured_key?Boolean

Returns:

  • (Boolean)


252
253
254
# File 'lib/rbbcc/table.rb', line 252

def structured_key?
  false # TODO: implement me in the future
end

#valuesObject



204
205
206
# File 'lib/rbbcc/table.rb', line 204

def values
  enum_for(:each_value).to_a
end