Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 323646
b: refs/heads/master
c: 6a6daec
h: refs/heads/master
v: v3
  • Loading branch information
Feng Tang authored and Arnaldo Carvalho de Melo committed Aug 8, 2012
1 parent 12261a8 commit c0cdfd7
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 2055fdaf8703d3101b12e0d9b7cbceaeabe35c17
refs/heads/master: 6a6daec2ae9f097703c1da4925367f1c198c9492
59 changes: 58 additions & 1 deletion trunk/tools/perf/util/scripting-engines/trace-event-python.c
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@
#include "../event.h"
#include "../thread.h"
#include "../trace-event.h"
#include "../evsel.h"

PyMODINIT_FUNC initperf_trace_context(void);

Expand Down Expand Up @@ -220,7 +221,7 @@ static inline struct event_format *find_cache_event(struct perf_evsel *evsel)
return event;
}

static void python_process_event(union perf_event *perf_event __unused,
static void python_process_tracepoint(union perf_event *perf_event __unused,
struct perf_sample *sample,
struct perf_evsel *evsel,
struct machine *machine __unused,
Expand Down Expand Up @@ -337,6 +338,62 @@ static void python_process_event(union perf_event *perf_event __unused,
Py_DECREF(t);
}

static void python_process_general_event(union perf_event *perf_event __unused,
struct perf_sample *sample,
struct perf_evsel *evsel,
struct machine *machine __unused,
struct thread *thread __unused)
{
PyObject *handler, *retval, *t;
static char handler_name[64];
unsigned n = 0;
void *data = sample->raw_data;

t = PyTuple_New(MAX_FIELDS);
if (!t)
Py_FatalError("couldn't create Python tuple");

snprintf(handler_name, sizeof(handler_name), "%s", "process_event");

handler = PyDict_GetItemString(main_dict, handler_name);
if (handler && !PyCallable_Check(handler)) {
handler = NULL;
goto exit;
}

/* Pass 3 parameters: event_attr, perf_sample, raw data */
PyTuple_SetItem(t, n++, PyString_FromStringAndSize((void *)&evsel->attr, sizeof(evsel->attr)));
PyTuple_SetItem(t, n++, PyString_FromStringAndSize((void *)sample, sizeof(*sample)));
PyTuple_SetItem(t, n++, PyString_FromStringAndSize(data, sample->raw_size));

if (_PyTuple_Resize(&t, n) == -1)
Py_FatalError("error resizing Python tuple");

retval = PyObject_CallObject(handler, t);
if (retval == NULL)
handler_call_die(handler_name);
exit:
Py_DECREF(t);
}

static void python_process_event(union perf_event *perf_event,
struct perf_sample *sample,
struct perf_evsel *evsel,
struct machine *machine,
struct thread *thread)
{
switch (evsel->attr.type) {
case PERF_TYPE_TRACEPOINT:
python_process_tracepoint(perf_event, sample, evsel,
machine, thread);
break;
/* Reserve for future process_hw/sw/raw APIs */
default:
python_process_general_event(perf_event, sample, evsel,
machine, thread);
}
}

static int run_start_sub(void)
{
PyObject *handler, *retval;
Expand Down

0 comments on commit c0cdfd7

Please sign in to comment.