aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/scripting-engines/trace-event-python.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/scripting-engines/trace-event-python.c')
-rw-r--r--tools/perf/util/scripting-engines/trace-event-python.c59
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
36PyMODINIT_FUNC initperf_trace_context(void); 37PyMODINIT_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
223static void python_process_event(union perf_event *perf_event __unused, 224static 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
341static 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);
375exit:
376 Py_DECREF(t);
377}
378
379static 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
340static int run_start_sub(void) 397static int run_start_sub(void)
341{ 398{
342 PyObject *handler, *retval; 399 PyObject *handler, *retval;