Skip to content

Commit fc4d9a5

Browse files
committed
Fix perf_buffer__new call
1 parent c0b982a commit fc4d9a5

File tree

2 files changed

+34
-28
lines changed

2 files changed

+34
-28
lines changed

src/core/bpf_perf_buffer.cpp

Lines changed: 32 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,38 @@
11
#include "bpf_perf_buffer.h"
22
#include "bpf_exception.h"
33

4+
BpfPerfBuffer::BpfPerfBuffer(int map_fd, int page_cnt, py::function callback,
5+
py::object lost_callback)
6+
: pb_(nullptr), callback_(std::move(callback)),
7+
lost_callback_(lost_callback) {
8+
9+
if (page_cnt <= 0 || (page_cnt & (page_cnt - 1)) != 0) {
10+
throw BpfException("page_cnt must be a positive power of 2");
11+
}
12+
13+
struct perf_buffer_opts pb_opts = {};
14+
pb_opts.sz = sizeof(pb_opts); // Required for forward compatibility
15+
16+
pb_ = perf_buffer__new(
17+
map_fd, page_cnt,
18+
sample_callback_wrapper, // sample_cb
19+
lost_callback.is_none() ? nullptr : lost_callback_wrapper, // lost_cb
20+
this, // ctx
21+
&pb_opts // opts
22+
);
23+
24+
if (!pb_) {
25+
throw BpfException("Failed to create perf buffer: " +
26+
std::string(std::strerror(errno)));
27+
}
28+
}
29+
30+
BpfPerfBuffer::~BpfPerfBuffer() {
31+
if (pb_) {
32+
perf_buffer__free(pb_);
33+
}
34+
}
35+
436
void BpfPerfBuffer::sample_callback_wrapper(void *ctx, int cpu, void *data,
537
unsigned int size) {
638
auto *self = static_cast<BpfPerfBuffer *>(ctx);
@@ -36,33 +68,6 @@ void BpfPerfBuffer::lost_callback_wrapper(void *ctx, int cpu,
3668
}
3769
}
3870

39-
BpfPerfBuffer::BpfPerfBuffer(int map_fd, int page_cnt, py::function callback,
40-
py::object lost_callback)
41-
: pb_(nullptr), callback_(std::move(callback)) {
42-
43-
if (!lost_callback.is_none()) {
44-
lost_callback_ = lost_callback.cast<py::function>();
45-
}
46-
47-
// Setup perf buffer options
48-
perf_buffer_opts pb_opts = {};
49-
pb_opts.sample_cb = sample_callback_wrapper;
50-
pb_opts.lost_cb = lost_callback.is_none() ? nullptr : lost_callback_wrapper;
51-
pb_opts.ctx = this;
52-
53-
// Create perf buffer
54-
pb_ = perf_buffer__new(map_fd, page_cnt, &pb_opts);
55-
if (!pb_) {
56-
throw BpfException("Failed to create perf buffer");
57-
}
58-
}
59-
60-
BpfPerfBuffer::~BpfPerfBuffer() {
61-
if (pb_) {
62-
perf_buffer__free(pb_);
63-
}
64-
}
65-
6671
int BpfPerfBuffer::poll(int timeout_ms) {
6772
// Release GIL during blocking poll
6873
py::gil_scoped_release release;

src/core/bpf_perf_buffer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ class BpfPerfBuffer {
2020

2121
public:
2222
BpfPerfBuffer(int map_fd, int page_cnt, py::function callback,
23-
py::object lost_callback);
23+
py::object lost_callback = py::none());
2424
~BpfPerfBuffer();
2525

2626
int poll(int timeout_ms);
2727
int consume();
28+
[[nodiscard]] int fd() const;
2829
};
2930

3031
#endif // PYLIBBPF_BPF_PERF_BUFFER_H

0 commit comments

Comments
 (0)