diff options
Diffstat (limited to 'tools/perf/util/scripting-engines/trace-event-python.c')
-rw-r--r-- | tools/perf/util/scripting-engines/trace-event-python.c | 59 |
1 files changed, 58 insertions, 1 deletions
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index df7d33d1de0f..b9010d878b4b 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c | |||
@@ -32,6 +32,7 @@ | |||
32 | #include "../event.h" | 32 | #include "../event.h" |
33 | #include "../thread.h" | 33 | #include "../thread.h" |
34 | #include "../trace-event.h" | 34 | #include "../trace-event.h" |
35 | #include "../evsel.h" | ||
35 | 36 | ||
36 | PyMODINIT_FUNC initperf_trace_context(void); | 37 | PyMODINIT_FUNC initperf_trace_context(void); |
37 | 38 | ||
@@ -220,7 +221,7 @@ static inline struct event_format *find_cache_event(struct perf_evsel *evsel) | |||
220 | return event; | 221 | return event; |
221 | } | 222 | } |
222 | 223 | ||
223 | static void python_process_event(union perf_event *perf_event __unused, | 224 | static void python_process_tracepoint(union perf_event *perf_event __unused, |
224 | struct perf_sample *sample, | 225 | struct perf_sample *sample, |
225 | struct perf_evsel *evsel, | 226 | struct perf_evsel *evsel, |
226 | struct machine *machine __unused, | 227 | struct machine *machine __unused, |
@@ -337,6 +338,62 @@ static void python_process_event(union perf_event *perf_event __unused, | |||
337 | Py_DECREF(t); | 338 | Py_DECREF(t); |
338 | } | 339 | } |
339 | 340 | ||
341 | static void python_process_general_event(union perf_event *perf_event __unused, | ||
342 | struct perf_sample *sample, | ||
343 | struct perf_evsel *evsel, | ||
344 | struct machine *machine __unused, | ||
345 | struct thread *thread __unused) | ||
346 | { | ||
347 | PyObject *handler, *retval, *t; | ||
348 | static char handler_name[64]; | ||
349 | unsigned n = 0; | ||
350 | void *data = sample->raw_data; | ||
351 | |||
352 | t = PyTuple_New(MAX_FIELDS); | ||
353 | if (!t) | ||
354 | Py_FatalError("couldn't create Python tuple"); | ||
355 | |||
356 | snprintf(handler_name, sizeof(handler_name), "%s", "process_event"); | ||
357 | |||
358 | handler = PyDict_GetItemString(main_dict, handler_name); | ||
359 | if (handler && !PyCallable_Check(handler)) { | ||
360 | handler = NULL; | ||
361 | goto exit; | ||
362 | } | ||
363 | |||
364 | /* Pass 3 parameters: event_attr, perf_sample, raw data */ | ||
365 | PyTuple_SetItem(t, n++, PyString_FromStringAndSize((void *)&evsel->attr, sizeof(evsel->attr))); | ||
366 | PyTuple_SetItem(t, n++, PyString_FromStringAndSize((void *)sample, sizeof(*sample))); | ||
367 | PyTuple_SetItem(t, n++, PyString_FromStringAndSize(data, sample->raw_size)); | ||
368 | |||
369 | if (_PyTuple_Resize(&t, n) == -1) | ||
370 | Py_FatalError("error resizing Python tuple"); | ||
371 | |||
372 | retval = PyObject_CallObject(handler, t); | ||
373 | if (retval == NULL) | ||
374 | handler_call_die(handler_name); | ||
375 | exit: | ||
376 | Py_DECREF(t); | ||
377 | } | ||
378 | |||
379 | static void python_process_event(union perf_event *perf_event, | ||
380 | struct perf_sample *sample, | ||
381 | struct perf_evsel *evsel, | ||
382 | struct machine *machine, | ||
383 | struct thread *thread) | ||
384 | { | ||
385 | switch (evsel->attr.type) { | ||
386 | case PERF_TYPE_TRACEPOINT: | ||
387 | python_process_tracepoint(perf_event, sample, evsel, | ||
388 | machine, thread); | ||
389 | break; | ||
390 | /* Reserve for future process_hw/sw/raw APIs */ | ||
391 | default: | ||
392 | python_process_general_event(perf_event, sample, evsel, | ||
393 | machine, thread); | ||
394 | } | ||
395 | } | ||
396 | |||
340 | static int run_start_sub(void) | 397 | static int run_start_sub(void) |
341 | { | 398 | { |
342 | PyObject *handler, *retval; | 399 | PyObject *handler, *retval; |