diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2011-07-26 00:13:27 +0400 | 
|---|---|---|
| committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2011-07-26 00:13:27 +0400 | 
| commit | 3e9f45a7a4179604ccbae1589de0e7165bc6fcd0 (patch) | |
| tree | c686afbfa9d5e67d15a0941c8e718cf56fc2aa08 /tools/perf/util/python.c | |
| parent | 4152ab377b55e9d3e5700de00ef799519ead698d (diff) | |
| download | linux-3e9f45a7a4179604ccbae1589de0e7165bc6fcd0.tar.xz | |
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 <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/n/tip-b0rc8y5jd03f9f11kftodvkm@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf/util/python.c')
| -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 = {  	.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)  | 
