|
|
@@ -34,7 +34,7 @@ private:
|
|
|
ebpf::BPF bpf;
|
|
|
void *mod;
|
|
|
Php::Object _perf_event;
|
|
|
- PerfEventArrayTable *_class_perf_event;
|
|
|
+ Php::Value _class_perf_event_obj;
|
|
|
|
|
|
static std::string add_prefix(const std::string &prefix, const std::string &name) {
|
|
|
if (name.rfind(prefix, 0) != 0) {
|
|
|
@@ -65,7 +65,10 @@ private:
|
|
|
bpf.attach_kprobe(kernel_func, fn_name, 0, BPF_PROBE_RETURN);
|
|
|
} else if (fn_name.rfind("tracepoint__", 0) == 0) {
|
|
|
std::string tp_name = fn_name.substr(12);
|
|
|
- std::replace(tp_name.begin(), tp_name.end(), '_', ':');
|
|
|
+ size_t sep = tp_name.find("__");
|
|
|
+ if (sep != std::string::npos) {
|
|
|
+ tp_name.replace(sep, 2, ":");
|
|
|
+ }
|
|
|
bpf.attach_tracepoint(tp_name, fn_name);
|
|
|
} else if (fn_name.rfind("raw_tracepoint__", 0) == 0) {
|
|
|
std::string tp_name = fn_name.substr(16);
|
|
|
@@ -418,11 +421,11 @@ public:
|
|
|
return Php::Value();
|
|
|
}
|
|
|
|
|
|
- Php::Value php_perf_event(Php::Parameters ¶ms) {
|
|
|
- std::string event_name = params[0].stringValue(); // Get event_name from the parameters
|
|
|
- this->_class_perf_event = new PerfEventArrayTable(&this->bpf, event_name);
|
|
|
- return Php::Object("PerfEventArrayTable", this->_class_perf_event);
|
|
|
- }
|
|
|
+// Php::Value php_perf_event(Php::Parameters ¶ms) {
|
|
|
+// std::string event_name = params[0].stringValue(); // Get event_name from the parameters
|
|
|
+// this->_class_perf_event = new PerfEventArrayTable(&this->bpf, event_name);
|
|
|
+// return Php::Object("PerfEventArrayTable", this->_class_perf_event);
|
|
|
+// }
|
|
|
|
|
|
Php::Value get_table_cls(const char *table_name, int from_attr) {
|
|
|
int ttype = bpf_table_type(this->mod, table_name);
|
|
|
@@ -434,8 +437,10 @@ public:
|
|
|
case BPF_MAP_TYPE_PROG_ARRAY:
|
|
|
return Php::Object("ProgArrayTable", new ProgArrayTable(&this->bpf, table_name));
|
|
|
case BPF_MAP_TYPE_PERF_EVENT_ARRAY:
|
|
|
- this->_class_perf_event = new PerfEventArrayTable(&this->bpf, table_name);
|
|
|
- return Php::Object("PerfEventArrayTable", this->_class_perf_event);
|
|
|
+ if (_class_perf_event_obj.isNull()) {
|
|
|
+ _class_perf_event_obj = Php::Object("PerfEventArrayTable",new PerfEventArrayTable(&this->bpf, table_name));
|
|
|
+ }
|
|
|
+ return _class_perf_event_obj;
|
|
|
case BPF_MAP_TYPE_PERCPU_HASH:
|
|
|
return Php::Object("PerCpuHashTable", new PerCpuHashTable(&this->bpf, table_name));
|
|
|
case BPF_MAP_TYPE_PERCPU_ARRAY:
|
|
|
@@ -481,11 +486,16 @@ public:
|
|
|
|
|
|
void php_perf_buffer_poll(Php::Parameters ¶ms) {
|
|
|
|
|
|
- if (!this->_class_perf_event) {
|
|
|
+ if (_class_perf_event_obj.isNull()) {
|
|
|
throw Php::Exception("perf event is null.");
|
|
|
}
|
|
|
+
|
|
|
+ auto *_class_perf_event = (PerfEventArrayTable *) _class_perf_event_obj.implementation();
|
|
|
+ if (!_class_perf_event) {
|
|
|
+ throw Php::Exception("perf buffer poll error1.");
|
|
|
+ }
|
|
|
int timeout_ms = -1;
|
|
|
- int res = this->_class_perf_event->perf_buffer_poll(timeout_ms);
|
|
|
+ int res = _class_perf_event->perf_buffer_poll(timeout_ms);
|
|
|
if (res < 0) {
|
|
|
throw Php::Exception("perf buffer poll error.");
|
|
|
}
|
|
|
@@ -561,14 +571,10 @@ PHPCPP_EXPORT void *get_module() {
|
|
|
Php::ByVal("options", Php::Type::Array, false),
|
|
|
});
|
|
|
|
|
|
-// ebpf_class.method<&EbpfExtension::php_open_perf_buffer>("open_perf_buffer", {
|
|
|
-// Php::ByVal("callback", Php::Type::Callable),
|
|
|
+// ebpf_class.method<&EbpfExtension::php_perf_event>("perf_event", {
|
|
|
+// Php::ByVal("ev_name", Php::Type::String),
|
|
|
// });
|
|
|
|
|
|
- ebpf_class.method<&EbpfExtension::php_perf_event>("perf_event", {
|
|
|
- Php::ByVal("ev_name", Php::Type::String),
|
|
|
- });
|
|
|
-
|
|
|
ebpf_class.method<&EbpfExtension::php_get_table>("get_table", {
|
|
|
Php::ByVal("tb_name", Php::Type::String),
|
|
|
});
|
|
|
@@ -599,8 +605,7 @@ PHPCPP_EXPORT void *get_module() {
|
|
|
|
|
|
/*HashTable*/
|
|
|
Php::Class<HashTable> ebpf_hashtable_cls("HashTable");
|
|
|
- ebpf_hashtable_cls.method<&HashTable::php_get_values>("values", {
|
|
|
- });
|
|
|
+ ebpf_hashtable_cls.method<&HashTable::php_get_values>("values", {});
|
|
|
/*ArrayTable*/
|
|
|
Php::Class<ArrayTable> ebpf_array_table_cls("ArrayTable");
|
|
|
ebpf_array_table_cls.method<&ArrayTable::php_get_value>("get_value", {
|
|
|
@@ -626,7 +631,7 @@ PHPCPP_EXPORT void *get_module() {
|
|
|
Php::Class<StackTraceTable> ebpf_stack_trace_table_cls("StackTraceTable");
|
|
|
ebpf_stack_trace_table_cls.method<&StackTraceTable::php_get_values>("values", {
|
|
|
Php::ByVal("stack", Php::Type::Numeric),
|
|
|
- Php::ByVal("pid", Php::Type::Numeric),
|
|
|
+ Php::ByVal("pid", Php::Type::Numeric, false),
|
|
|
});
|
|
|
|
|
|
/*LruHashTable*/
|