diff options
| -rw-r--r-- | tools/perf/util/python.c | 115 |
1 files changed, 112 insertions, 3 deletions
diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c index 8e0b5a39d8a7..cbc8f215d4b7 100644 --- a/tools/perf/util/python.c +++ b/tools/perf/util/python.c | |||
| @@ -187,16 +187,119 @@ static PyTypeObject pyrf_throttle_event__type = { | |||
| 187 | .tp_repr = (reprfunc)pyrf_throttle_event__repr, | 187 | .tp_repr = (reprfunc)pyrf_throttle_event__repr, |
| 188 | }; | 188 | }; |
| 189 | 189 | ||
| 190 | static char pyrf_lost_event__doc[] = PyDoc_STR("perf lost event object."); | ||
| 191 | |||
| 192 | static PyMemberDef pyrf_lost_event__members[] = { | ||
| 193 | sample_members | ||
| 194 | member_def(lost_event, id, T_ULONGLONG, "event id"), | ||
| 195 | member_def(lost_event, lost, T_ULONGLONG, "number of lost events"), | ||
| 196 | { .name = NULL, }, | ||
| 197 | }; | ||
| 198 | |||
| 199 | static PyObject *pyrf_lost_event__repr(struct pyrf_event *pevent) | ||
| 200 | { | ||
| 201 | PyObject *ret; | ||
| 202 | char *s; | ||
| 203 | |||
| 204 | if (asprintf(&s, "{ type: lost, id: %#" PRIx64 ", " | ||
| 205 | "lost: %#" PRIx64 " }", | ||
| 206 | pevent->event.lost.id, pevent->event.lost.lost) < 0) { | ||
| 207 | ret = PyErr_NoMemory(); | ||
| 208 | } else { | ||
| 209 | ret = PyString_FromString(s); | ||
| 210 | free(s); | ||
| 211 | } | ||
| 212 | return ret; | ||
| 213 | } | ||
| 214 | |||
| 215 | static PyTypeObject pyrf_lost_event__type = { | ||
| 216 | PyVarObject_HEAD_INIT(NULL, 0) | ||
| 217 | .tp_name = "perf.lost_event", | ||
| 218 | .tp_basicsize = sizeof(struct pyrf_event), | ||
| 219 | .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, | ||
| 220 | .tp_doc = pyrf_lost_event__doc, | ||
| 221 | .tp_members = pyrf_lost_event__members, | ||
| 222 | .tp_repr = (reprfunc)pyrf_lost_event__repr, | ||
| 223 | }; | ||
| 224 | |||
| 225 | static char pyrf_read_event__doc[] = PyDoc_STR("perf read event object."); | ||
| 226 | |||
| 227 | static PyMemberDef pyrf_read_event__members[] = { | ||
| 228 | sample_members | ||
| 229 | member_def(read_event, pid, T_UINT, "event pid"), | ||
| 230 | member_def(read_event, tid, T_UINT, "event tid"), | ||
| 231 | { .name = NULL, }, | ||
| 232 | }; | ||
| 233 | |||
| 234 | static PyObject *pyrf_read_event__repr(struct pyrf_event *pevent) | ||
| 235 | { | ||
| 236 | return PyString_FromFormat("{ type: read, pid: %u, tid: %u }", | ||
| 237 | pevent->event.read.pid, | ||
| 238 | pevent->event.read.tid); | ||
| 239 | /* | ||
| 240 | * FIXME: return the array of read values, | ||
| 241 | * making this method useful ;-) | ||
| 242 | */ | ||
| 243 | } | ||
| 244 | |||
| 245 | static PyTypeObject pyrf_read_event__type = { | ||
| 246 | PyVarObject_HEAD_INIT(NULL, 0) | ||
| 247 | .tp_name = "perf.read_event", | ||
| 248 | .tp_basicsize = sizeof(struct pyrf_event), | ||
| 249 | .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, | ||
| 250 | .tp_doc = pyrf_read_event__doc, | ||
| 251 | .tp_members = pyrf_read_event__members, | ||
| 252 | .tp_repr = (reprfunc)pyrf_read_event__repr, | ||
| 253 | }; | ||
| 254 | |||
| 255 | static char pyrf_sample_event__doc[] = PyDoc_STR("perf sample event object."); | ||
| 256 | |||
| 257 | static PyMemberDef pyrf_sample_event__members[] = { | ||
| 258 | sample_members | ||
| 259 | member_def(perf_event_header, type, T_UINT, "event type"), | ||
| 260 | { .name = NULL, }, | ||
| 261 | }; | ||
| 262 | |||
| 263 | static PyObject *pyrf_sample_event__repr(struct pyrf_event *pevent) | ||
| 264 | { | ||
| 265 | PyObject *ret; | ||
| 266 | char *s; | ||
| 267 | |||
| 268 | if (asprintf(&s, "{ type: sample }") < 0) { | ||
| 269 | ret = PyErr_NoMemory(); | ||
| 270 | } else { | ||
| 271 | ret = PyString_FromString(s); | ||
| 272 | free(s); | ||
| 273 | } | ||
| 274 | return ret; | ||
| 275 | } | ||
| 276 | |||
| 277 | static PyTypeObject pyrf_sample_event__type = { | ||
| 278 | PyVarObject_HEAD_INIT(NULL, 0) | ||
| 279 | .tp_name = "perf.sample_event", | ||
| 280 | .tp_basicsize = sizeof(struct pyrf_event), | ||
| 281 | .tp_flags = Py_TPFLAGS_DEFAULT|Py_TPFLAGS_BASETYPE, | ||
| 282 | .tp_doc = pyrf_sample_event__doc, | ||
| 283 | .tp_members = pyrf_sample_event__members, | ||
| 284 | .tp_repr = (reprfunc)pyrf_sample_event__repr, | ||
| 285 | }; | ||
| 286 | |||
| 190 | static int pyrf_event__setup_types(void) | 287 | static int pyrf_event__setup_types(void) |
| 191 | { | 288 | { |
| 192 | int err; | 289 | int err; |
| 193 | pyrf_mmap_event__type.tp_new = | 290 | pyrf_mmap_event__type.tp_new = |
| 194 | pyrf_task_event__type.tp_new = | 291 | pyrf_task_event__type.tp_new = |
| 195 | pyrf_comm_event__type.tp_new = | 292 | pyrf_comm_event__type.tp_new = |
| 293 | pyrf_lost_event__type.tp_new = | ||
| 294 | pyrf_read_event__type.tp_new = | ||
| 295 | pyrf_sample_event__type.tp_new = | ||
| 196 | pyrf_throttle_event__type.tp_new = PyType_GenericNew; | 296 | pyrf_throttle_event__type.tp_new = PyType_GenericNew; |
| 197 | err = PyType_Ready(&pyrf_mmap_event__type); | 297 | err = PyType_Ready(&pyrf_mmap_event__type); |
| 198 | if (err < 0) | 298 | if (err < 0) |
| 199 | goto out; | 299 | goto out; |
| 300 | err = PyType_Ready(&pyrf_lost_event__type); | ||
| 301 | if (err < 0) | ||
| 302 | goto out; | ||
| 200 | err = PyType_Ready(&pyrf_task_event__type); | 303 | err = PyType_Ready(&pyrf_task_event__type); |
| 201 | if (err < 0) | 304 | if (err < 0) |
| 202 | goto out; | 305 | goto out; |
| @@ -206,20 +309,26 @@ static int pyrf_event__setup_types(void) | |||
| 206 | err = PyType_Ready(&pyrf_throttle_event__type); | 309 | err = PyType_Ready(&pyrf_throttle_event__type); |
| 207 | if (err < 0) | 310 | if (err < 0) |
| 208 | goto out; | 311 | goto out; |
| 312 | err = PyType_Ready(&pyrf_read_event__type); | ||
| 313 | if (err < 0) | ||
| 314 | goto out; | ||
| 315 | err = PyType_Ready(&pyrf_sample_event__type); | ||
| 316 | if (err < 0) | ||
| 317 | goto out; | ||
| 209 | out: | 318 | out: |
| 210 | return err; | 319 | return err; |
| 211 | } | 320 | } |
| 212 | 321 | ||
| 213 | static PyTypeObject *pyrf_event__type[] = { | 322 | static PyTypeObject *pyrf_event__type[] = { |
| 214 | [PERF_RECORD_MMAP] = &pyrf_mmap_event__type, | 323 | [PERF_RECORD_MMAP] = &pyrf_mmap_event__type, |
| 215 | [PERF_RECORD_LOST] = &pyrf_mmap_event__type, | 324 | [PERF_RECORD_LOST] = &pyrf_lost_event__type, |
| 216 | [PERF_RECORD_COMM] = &pyrf_comm_event__type, | 325 | [PERF_RECORD_COMM] = &pyrf_comm_event__type, |
| 217 | [PERF_RECORD_EXIT] = &pyrf_task_event__type, | 326 | [PERF_RECORD_EXIT] = &pyrf_task_event__type, |
| 218 | [PERF_RECORD_THROTTLE] = &pyrf_throttle_event__type, | 327 | [PERF_RECORD_THROTTLE] = &pyrf_throttle_event__type, |
| 219 | [PERF_RECORD_UNTHROTTLE] = &pyrf_throttle_event__type, | 328 | [PERF_RECORD_UNTHROTTLE] = &pyrf_throttle_event__type, |
| 220 | [PERF_RECORD_FORK] = &pyrf_task_event__type, | 329 | [PERF_RECORD_FORK] = &pyrf_task_event__type, |
| 221 | [PERF_RECORD_READ] = &pyrf_mmap_event__type, | 330 | [PERF_RECORD_READ] = &pyrf_read_event__type, |
| 222 | [PERF_RECORD_SAMPLE] = &pyrf_mmap_event__type, | 331 | [PERF_RECORD_SAMPLE] = &pyrf_sample_event__type, |
| 223 | }; | 332 | }; |
| 224 | 333 | ||
| 225 | static PyObject *pyrf_event__new(union perf_event *event) | 334 | static PyObject *pyrf_event__new(union perf_event *event) |
