perf python: Add PERF_RECORD_{LOST,READ,SAMPLE} routine tables
Commit-ID: 3e9f45a7a4179604ccbae1589de0e7165bc6fcd0 Gitweb: http://git.kernel.org/tip/3e9f45a7a4179604ccbae1589de0e7165bc6fcd0 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Mon, 25 Jul 2011 17:13:27 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Mon, 25 Jul 2011 17:13:27 -0300
perf python: Add PERF_RECORD_{LOST,READ,SAMPLE} routine tables
So those friggin "spurious" PERF_RECORD_MMAP events were actually a brain fart copy'n'paste error in the python binding, doh. I.e. they weren't MMAPs, just SAMPLEs.
Fix it by providing routines for these events instead of using the MMAP ones.
Cc David Ahern <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Mike Galbraith <[email protected]>
Cc Paul Mackerras <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/python.c | 115 ++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 112 insertions(+), 3 deletions(-)
tools/perf/util/python.c +112 -3
@@ -187,16 +187,119 @@ 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);if (err <0 ) goto out;
@@ -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)