Class: RbBCC::TableBase
- Inherits:
-
Object
show all
- Includes:
- Enumerable, Fiddle::Importer, CPUHelper
- Defined in:
- lib/rbbcc/table.rb
Instance Attribute Summary collapse
Class Method Summary
collapse
Instance Method Summary
collapse
-
#[](_key) ⇒ Object
-
#[]=(_key, _leaf) ⇒ Object
-
#clear ⇒ Object
-
#delete(key) ⇒ Object
-
#each_key ⇒ Object
-
#each_pair ⇒ Object
(also: #each)
-
#each_value ⇒ Object
-
#fetch(key) ⇒ Object
-
#initialize(bpf, map_id, map_fd, keytype, leaftype, name: nil, keysize: nil, leafsize: nil) ⇒ TableBase
constructor
A new instance of TableBase.
-
#items ⇒ Object
-
#next(key) ⇒ Object
-
#print_linear_hist(val_type = "value", section_header: "Bucket ptr", section_print_fn: nil, bucket_fn: nil, bucket_sort_fn: nil) ⇒ Object
-
#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) ⇒ Object
-
#structured_key? ⇒ Boolean
-
#values ⇒ Object
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, keysize: nil, leafsize: nil) ⇒ TableBase
Returns a new instance of TableBase.
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
# File 'lib/rbbcc/table.rb', line 130
def initialize(bpf, map_id, map_fd, keytype, leaftype, name: nil, keysize: nil, leafsize: nil)
@bpf, @map_id, @map_fd, @keysize, @leafsize = \
bpf, map_id, map_fd,
keysize || sizeof(keytype),
leafsize || sizeof(leaftype)
@keytype = keytype
@leaftype = leaftype
if @bpf
@ttype = Clib.bpf_table_type_id(self.bpf.module, self.map_id)
@flags = Clib.bpf_table_flags_id(self.bpf.module, self.map_id)
else
@ttype = case self
when HashTable
Table::BPF_MAP_TYPE_HASH
when ArrayTable
Table::BPF_MAP_TYPE_ARRAY
when PerfEventArray
Table::BPF_MAP_TYPE_PERF_EVENT_ARRAY
when RingBuf
Table::BPF_MAP_TYPE_RINGBUF
end
end
@name = name
end
|
Instance Attribute Details
#bpf ⇒ Object
Returns the value of attribute bpf.
154
155
156
|
# File 'lib/rbbcc/table.rb', line 154
def bpf
@bpf
end
|
#flags ⇒ Object
Returns the value of attribute flags.
154
155
156
|
# File 'lib/rbbcc/table.rb', line 154
def flags
@flags
end
|
#keysize ⇒ Object
Returns the value of attribute keysize.
154
155
156
|
# File 'lib/rbbcc/table.rb', line 154
def keysize
@keysize
end
|
#keytype ⇒ Object
Returns the value of attribute keytype.
154
155
156
|
# File 'lib/rbbcc/table.rb', line 154
def keytype
@keytype
end
|
#leafsize ⇒ Object
Returns the value of attribute leafsize.
154
155
156
|
# File 'lib/rbbcc/table.rb', line 154
def leafsize
@leafsize
end
|
#leaftype ⇒ Object
Returns the value of attribute leaftype.
154
155
156
|
# File 'lib/rbbcc/table.rb', line 154
def leaftype
@leaftype
end
|
#map_fd ⇒ Object
Returns the value of attribute map_fd.
154
155
156
|
# File 'lib/rbbcc/table.rb', line 154
def map_fd
@map_fd
end
|
#map_id ⇒ Object
Returns the value of attribute map_id.
154
155
156
|
# File 'lib/rbbcc/table.rb', line 154
def map_id
@map_id
end
|
#name ⇒ Object
Returns the value of attribute name.
154
155
156
|
# File 'lib/rbbcc/table.rb', line 154
def name
@name
end
|
#ttype ⇒ Object
Returns the value of attribute ttype.
154
155
156
|
# File 'lib/rbbcc/table.rb', line 154
def ttype
@ttype
end
|
Class Method Details
.from_pin(path, keytype, leaftype, keysize: nil, leafsize: nil, **kwargs) ⇒ Object
119
120
121
122
123
124
125
126
127
|
# File 'lib/rbbcc/table.rb', line 119
def from_pin(path, keytype, leaftype, keysize: nil, leafsize: nil, **kwargs)
map_fd = Clib.bpf_obj_get(path)
if map_fd < 0
raise SystemCallError.new("Could not open pinned map", Fiddle.last_error)
end
new(nil, nil, map_fd, keytype, leaftype,
keysize: keysize, leafsize: leafsize, **kwargs)
end
|
Instance Method Details
#[](_key) ⇒ Object
177
178
179
180
181
182
183
184
185
186
187
|
# File 'lib/rbbcc/table.rb', line 177
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
193
194
195
196
197
198
199
200
201
|
# File 'lib/rbbcc/table.rb', line 193
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
|
#clear ⇒ Object
239
240
241
242
|
# File 'lib/rbbcc/table.rb', line 239
def clear
each_key {|key| self.delete(key) }
return items end
|
#delete(key) ⇒ Object
203
204
205
206
207
208
209
|
# File 'lib/rbbcc/table.rb', line 203
def delete(key)
res = Clib.bpf_delete_elem(self.map_fd, key)
if res < 0
raise KeyError, "key not found"
end
res
end
|
#each_key ⇒ Object
211
212
213
214
215
216
217
218
219
220
|
# File 'lib/rbbcc/table.rb', line 211
def each_key
k = nil
keys = []
loop do
k = self.next(k)
keys << k
yield k
end
keys
end
|
#each_pair ⇒ Object
Also known as:
each
226
227
228
|
# File 'lib/rbbcc/table.rb', line 226
def each_pair
each_key {|key| yield(key, self[key]) if self[key] }
end
|
#each_value ⇒ Object
222
223
224
|
# File 'lib/rbbcc/table.rb', line 222
def each_value
each_key {|key| yield(self[key]) if self[key] }
end
|
#fetch(key) ⇒ Object
189
190
191
|
# File 'lib/rbbcc/table.rb', line 189
def fetch(key)
self[key] || raise(KeyError, "key not found")
end
|
#items ⇒ Object
235
236
237
|
# File 'lib/rbbcc/table.rb', line 235
def items
enum_for(:each_pair).to_a
end
|
#next(key) ⇒ Object
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
|
# File 'lib/rbbcc/table.rb', line 156
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
|
#print_linear_hist(val_type = "value", section_header: "Bucket ptr", section_print_fn: nil, bucket_fn: nil, bucket_sort_fn: nil) ⇒ Object
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
|
# File 'lib/rbbcc/table.rb', line 262
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
|
#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) ⇒ Object
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
|
# File 'lib/rbbcc/table.rb', line 244
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
279
280
281
|
# File 'lib/rbbcc/table.rb', line 279
def structured_key?
false end
|
#values ⇒ Object
231
232
233
|
# File 'lib/rbbcc/table.rb', line 231
def values
enum_for(:each_value).to_a
end
|