|
|
|
@ -187,14 +187,117 @@ static PyTypeObject pyrf_throttle_event__type = { |
|
|
|
|
.tp_repr = (reprfunc)pyrf_throttle_event__repr, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static char pyrf_lost_event__doc[] = PyDoc_STR("perf lost event object."); |
|
|
|
|
|
|
|
|
|
static PyMemberDef pyrf_lost_event__members[] = { |
|
|
|
|
sample_members |
|
|
|
|
member_def(lost_event, id, T_ULONGLONG, "event id"), |
|
|
|
|
member_def(lost_event, lost, T_ULONGLONG, "number of lost events"), |
|
|
|
|
{ .name = NULL, }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static PyObject *pyrf_lost_event__repr(struct pyrf_event *pevent) |
|
|
|
|
{ |
|
|
|
|
PyObject *ret; |
|
|
|
|
char *s; |
|
|
|
|
|
|
|
|
|
if (asprintf(&s, "{ type: lost, id: %#" PRIx64 ", " |
|
|
|
|
"lost: %#" PRIx64 " }", |
|
|
|
|
pevent->event.lost.id, pevent->event.lost.lost) < 0) { |
|
|
|
|
ret = PyErr_NoMemory(); |
|
|
|
|
} else { |
|
|
|
|
ret = PyString_FromString(s); |
|
|
|
|
free(s); |
|
|
|
|
} |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static PyTypeObject pyrf_lost_event__type = { |
|
|
|
|
PyVarObject_HEAD_INIT(NULL, 0) |
|
|
|
|
.tp_name = "perf.lost_event", |
|
|
|
|
.tp_basicsize = sizeof(struct pyrf_event), |
|
|
|
|
.tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, |
|
|
|
|
.tp_doc = pyrf_lost_event__doc, |
|
|
|
|
.tp_members = pyrf_lost_event__members, |
|
|
|
|
.tp_repr = (reprfunc)pyrf_lost_event__repr, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static char pyrf_read_event__doc[] = PyDoc_STR("perf read event object."); |
|
|
|
|
|
|
|
|
|
static PyMemberDef pyrf_read_event__members[] = { |
|
|
|
|
sample_members |
|
|
|
|
member_def(read_event, pid, T_UINT, "event pid"), |
|
|
|
|
member_def(read_event, tid, T_UINT, "event tid"), |
|
|
|
|
{ .name = NULL, }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static PyObject *pyrf_read_event__repr(struct pyrf_event *pevent) |
|
|
|
|
{ |
|
|
|
|
return PyString_FromFormat("{ type: read, pid: %u, tid: %u }", |
|
|
|
|
pevent->event.read.pid, |
|
|
|
|
pevent->event.read.tid); |
|
|
|
|
/*
|
|
|
|
|
* FIXME: return the array of read values, |
|
|
|
|
* making this method useful ;-) |
|
|
|
|
*/ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static PyTypeObject pyrf_read_event__type = { |
|
|
|
|
PyVarObject_HEAD_INIT(NULL, 0) |
|
|
|
|
.tp_name = "perf.read_event", |
|
|
|
|
.tp_basicsize = sizeof(struct pyrf_event), |
|
|
|
|
.tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, |
|
|
|
|
.tp_doc = pyrf_read_event__doc, |
|
|
|
|
.tp_members = pyrf_read_event__members, |
|
|
|
|
.tp_repr = (reprfunc)pyrf_read_event__repr, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static char pyrf_sample_event__doc[] = PyDoc_STR("perf sample event object."); |
|
|
|
|
|
|
|
|
|
static PyMemberDef pyrf_sample_event__members[] = { |
|
|
|
|
sample_members |
|
|
|
|
member_def(perf_event_header, type, T_UINT, "event type"), |
|
|
|
|
{ .name = NULL, }, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent) |
|
|
|
|
{ |
|
|
|
|
PyObject *ret; |
|
|
|
|
char *s; |
|
|
|
|
|
|
|
|
|
if (asprintf(&s, "{ type: sample }") < 0) { |
|
|
|
|
ret = PyErr_NoMemory(); |
|
|
|
|
} else { |
|
|
|
|
ret = PyString_FromString(s); |
|
|
|
|
free(s); |
|
|
|
|
} |
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static PyTypeObject pyrf_sample_event__type = { |
|
|
|
|
PyVarObject_HEAD_INIT(NULL, 0) |
|
|
|
|
.tp_name = "perf.sample_event", |
|
|
|
|
.tp_basicsize = sizeof(struct pyrf_event), |
|
|
|
|
.tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, |
|
|
|
|
.tp_doc = pyrf_sample_event__doc, |
|
|
|
|
.tp_members = pyrf_sample_event__members, |
|
|
|
|
.tp_repr = (reprfunc)pyrf_sample_event__repr, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static int pyrf_event__setup_types(void) |
|
|
|
|
{ |
|
|
|
|
int err; |
|
|
|
|
pyrf_mmap_event__type.tp_new = |
|
|
|
|
pyrf_task_event__type.tp_new = |
|
|
|
|
pyrf_comm_event__type.tp_new = |
|
|
|
|
pyrf_lost_event__type.tp_new = |
|
|
|
|
pyrf_read_event__type.tp_new = |
|
|
|
|
pyrf_sample_event__type.tp_new = |
|
|
|
|
pyrf_throttle_event__type.tp_new = PyType_GenericNew; |
|
|
|
|
err = PyType_Ready(&pyrf_mmap_event__type); |
|
|
|
|
if (err < 0) |
|
|
|
|
goto out; |
|
|
|
|
err = PyType_Ready(&pyrf_lost_event__type); |
|
|
|
|
if (err < 0) |
|
|
|
|
goto out; |
|
|
|
|
err = PyType_Ready(&pyrf_task_event__type); |
|
|
|
@ -206,20 +309,26 @@ static int pyrf_event__setup_types(void) |
|
|
|
|
err = PyType_Ready(&pyrf_throttle_event__type); |
|
|
|
|
if (err < 0) |
|
|
|
|
goto out; |
|
|
|
|
err = PyType_Ready(&pyrf_read_event__type); |
|
|
|
|
if (err < 0) |
|
|
|
|
goto out; |
|
|
|
|
err = PyType_Ready(&pyrf_sample_event__type); |
|
|
|
|
if (err < 0) |
|
|
|
|
goto out; |
|
|
|
|
out: |
|
|
|
|
return err; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static PyTypeObject *pyrf_event__type[] = { |
|
|
|
|
[PERF_RECORD_MMAP] = &pyrf_mmap_event__type, |
|
|
|
|
[PERF_RECORD_LOST] = &pyrf_mmap_event__type, |
|
|
|
|
[PERF_RECORD_LOST] = &pyrf_lost_event__type, |
|
|
|
|
[PERF_RECORD_COMM] = &pyrf_comm_event__type, |
|
|
|
|
[PERF_RECORD_EXIT] = &pyrf_task_event__type, |
|
|
|
|
[PERF_RECORD_THROTTLE] = &pyrf_throttle_event__type, |
|
|
|
|
[PERF_RECORD_UNTHROTTLE] = &pyrf_throttle_event__type, |
|
|
|
|
[PERF_RECORD_FORK] = &pyrf_task_event__type, |
|
|
|
|
[PERF_RECORD_READ] = &pyrf_mmap_event__type, |
|
|
|
|
[PERF_RECORD_SAMPLE] = &pyrf_mmap_event__type, |
|
|
|
|
[PERF_RECORD_READ] = &pyrf_read_event__type, |
|
|
|
|
[PERF_RECORD_SAMPLE] = &pyrf_sample_event__type, |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static PyObject *pyrf_event__new(union perf_event *event) |
|
|
|
|