diff options
| author | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2011-10-26 21:46:20 -0700 | 
|---|---|---|
| committer | Dmitry Torokhov <dmitry.torokhov@gmail.com> | 2011-10-26 21:46:20 -0700 | 
| commit | 6ad390a25a9d1d8606b9b826878f0a30639dc2b3 (patch) | |
| tree | 05aff14f02776bc0d59a1f777cb92df6f4456ba9 /tools/perf/util/python.c | |
| parent | d6069dae4700cf5290a75002c46b9be8ea7eef3c (diff) | |
| parent | 3f48e7354358519e5b93f7f755ec270b3f8eafa0 (diff) | |
Merge branch 'next' into for-linus
Diffstat (limited to 'tools/perf/util/python.c')
| -rw-r--r-- | tools/perf/util/python.c | 132 | 
1 files changed, 121 insertions, 11 deletions
| diff --git a/tools/perf/util/python.c b/tools/perf/util/python.c index a9ac0504aab..cbc8f215d4b 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) @@ -247,7 +356,7 @@ struct pyrf_cpu_map {  static int pyrf_cpu_map__init(struct pyrf_cpu_map *pcpus,  			      PyObject *args, PyObject *kwargs)  { -	static char *kwlist[] = { "cpustr", NULL, NULL, }; +	static char *kwlist[] = { "cpustr", NULL };  	char *cpustr = NULL;  	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|s", @@ -316,7 +425,7 @@ struct pyrf_thread_map {  static int pyrf_thread_map__init(struct pyrf_thread_map *pthreads,  				 PyObject *args, PyObject *kwargs)  { -	static char *kwlist[] = { "pid", "tid", NULL, NULL, }; +	static char *kwlist[] = { "pid", "tid", NULL };  	int pid = -1, tid = -1;  	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ii", @@ -418,7 +527,9 @@ static int pyrf_evsel__init(struct pyrf_evsel *pevsel,  		"wakeup_events",  		"bp_type",  		"bp_addr", -		"bp_len", NULL, NULL, }; +		"bp_len", +		 NULL +	};  	u64 sample_period = 0;  	u32 disabled = 0,  	    inherit = 0, @@ -499,7 +610,7 @@ static PyObject *pyrf_evsel__open(struct pyrf_evsel *pevsel,  	struct thread_map *threads = NULL;  	PyObject *pcpus = NULL, *pthreads = NULL;  	int group = 0, inherit = 0; -	static char *kwlist[] = {"cpus", "threads", "group", "inherit", NULL, NULL}; +	static char *kwlist[] = { "cpus", "threads", "group", "inherit", NULL };  	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|OOii", kwlist,  					 &pcpus, &pthreads, &group, &inherit)) @@ -582,8 +693,7 @@ static PyObject *pyrf_evlist__mmap(struct pyrf_evlist *pevlist,  				   PyObject *args, PyObject *kwargs)  {  	struct perf_evlist *evlist = &pevlist->evlist; -	static char *kwlist[] = {"pages", "overwrite", -				  NULL, NULL}; +	static char *kwlist[] = { "pages", "overwrite", NULL };  	int pages = 128, overwrite = false;  	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|ii", kwlist, @@ -603,7 +713,7 @@ static PyObject *pyrf_evlist__poll(struct pyrf_evlist *pevlist,  				   PyObject *args, PyObject *kwargs)  {  	struct perf_evlist *evlist = &pevlist->evlist; -	static char *kwlist[] = {"timeout", NULL, NULL}; +	static char *kwlist[] = { "timeout", NULL };  	int timeout = -1, n;  	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "|i", kwlist, &timeout)) @@ -674,7 +784,7 @@ static PyObject *pyrf_evlist__read_on_cpu(struct pyrf_evlist *pevlist,  	struct perf_evlist *evlist = &pevlist->evlist;  	union perf_event *event;  	int sample_id_all = 1, cpu; -	static char *kwlist[] = {"cpu", "sample_id_all", NULL, NULL}; +	static char *kwlist[] = { "cpu", "sample_id_all", NULL };  	int err;  	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i|i", kwlist, | 
