Skip to content

Commit 30021e8

Browse files
committed
Add PerfEventArray and BpfObject wrappers
1 parent 0e454bd commit 30021e8

File tree

1 file changed

+80
-0
lines changed

1 file changed

+80
-0
lines changed

wrappers.py

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
from typing import Callable, Optional
2+
3+
4+
class PerfEventArrayHelper:
5+
"""Fluent wrapper for PERF_EVENT_ARRAY maps."""
6+
7+
def __init__(self, bpf_map):
8+
self._map = bpf_map
9+
self._perf_buffer = None
10+
11+
def open_perf_buffer(
12+
self,
13+
callback: Callable,
14+
struct_name: str = "",
15+
page_cnt: int = 8,
16+
lost_callback: Optional[Callable] = None
17+
):
18+
"""Open perf buffer with auto-deserialization."""
19+
from .pylibbpf import PerfEventArray
20+
21+
if struct_name:
22+
self._perf_buffer = PerfEventArray(
23+
self._map,
24+
page_cnt,
25+
callback,
26+
struct_name,
27+
lost_callback or (lambda cpu, cnt: None)
28+
)
29+
else:
30+
self._perf_buffer = PerfEventArray(
31+
self._map,
32+
page_cnt,
33+
callback,
34+
lost_callback or (lambda cpu, cnt: None)
35+
)
36+
37+
return self
38+
39+
def poll(self, timeout_ms: int = -1) -> int:
40+
if not self._perf_buffer:
41+
raise RuntimeError("Call open_perf_buffer() first")
42+
return self._perf_buffer.poll(timeout_ms)
43+
44+
def consume(self) -> int:
45+
if not self._perf_buffer:
46+
raise RuntimeError("Call open_perf_buffer() first")
47+
return self._perf_buffer.consume()
48+
49+
def __getattr__(self, name):
50+
return getattr(self._map, name)
51+
52+
53+
class BpfObjectWrapper:
54+
"""Smart wrapper that returns map-specific helpers."""
55+
56+
BPF_MAP_TYPE_PERF_EVENT_ARRAY = 4
57+
BPF_MAP_TYPE_RINGBUF = 27
58+
59+
def __init__(self, bpf_object):
60+
self._obj = bpf_object
61+
self._map_helpers = {}
62+
63+
def __getitem__(self, name: str):
64+
"""Return appropriate helper based on map type."""
65+
if name in self._map_helpers:
66+
return self._map_helpers[name]
67+
68+
map_obj = self._obj[name]
69+
map_type = map_obj.get_type()
70+
71+
if map_type == self.BPF_MAP_TYPE_PERF_EVENT_ARRAY:
72+
helper = PerfEventArrayHelper(map_obj)
73+
else:
74+
helper = map_obj
75+
76+
self._map_helpers[name] = helper
77+
return helper
78+
79+
def __getattr__(self, name):
80+
return getattr(self._obj, name)

0 commit comments

Comments
 (0)