diff options
Diffstat (limited to 'tools/perf/util/scripting-engines/trace-event-python.c')
| -rw-r--r-- | tools/perf/util/scripting-engines/trace-event-python.c | 147 | 
1 files changed, 104 insertions, 43 deletions
| diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index ea070883c593..10dd5fce082b 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c @@ -49,7 +49,37 @@  #include "print_binary.h"  #include "stat.h" +#if PY_MAJOR_VERSION < 3 +#define _PyUnicode_FromString(arg) \ +  PyString_FromString(arg) +#define _PyUnicode_FromStringAndSize(arg1, arg2) \ +  PyString_FromStringAndSize((arg1), (arg2)) +#define _PyBytes_FromStringAndSize(arg1, arg2) \ +  PyString_FromStringAndSize((arg1), (arg2)) +#define _PyLong_FromLong(arg) \ +  PyInt_FromLong(arg) +#define _PyLong_AsLong(arg) \ +  PyInt_AsLong(arg) +#define _PyCapsule_New(arg1, arg2, arg3) \ +  PyCObject_FromVoidPtr((arg1), (arg2)) +  PyMODINIT_FUNC initperf_trace_context(void); +#else +#define _PyUnicode_FromString(arg) \ +  PyUnicode_FromString(arg) +#define _PyUnicode_FromStringAndSize(arg1, arg2) \ +  PyUnicode_FromStringAndSize((arg1), (arg2)) +#define _PyBytes_FromStringAndSize(arg1, arg2) \ +  PyBytes_FromStringAndSize((arg1), (arg2)) +#define _PyLong_FromLong(arg) \ +  PyLong_FromLong(arg) +#define _PyLong_AsLong(arg) \ +  PyLong_AsLong(arg) +#define _PyCapsule_New(arg1, arg2, arg3) \ +  PyCapsule_New((arg1), (arg2), (arg3)) + +PyMODINIT_FUNC PyInit_perf_trace_context(void); +#endif  #define TRACE_EVENT_TYPE_MAX				\  	((1 << (sizeof(unsigned short) * 8)) - 1) @@ -135,7 +165,7 @@ static int get_argument_count(PyObject *handler)  		PyObject *arg_count_obj = PyObject_GetAttrString(code_obj,  			"co_argcount");  		if (arg_count_obj) { -			arg_count = (int) PyInt_AsLong(arg_count_obj); +			arg_count = (int) _PyLong_AsLong(arg_count_obj);  			Py_DECREF(arg_count_obj);  		}  		Py_DECREF(code_obj); @@ -182,10 +212,10 @@ static void define_value(enum print_arg_type field_type,  	value = eval_flag(field_value); -	PyTuple_SetItem(t, n++, PyString_FromString(ev_name)); -	PyTuple_SetItem(t, n++, PyString_FromString(field_name)); -	PyTuple_SetItem(t, n++, PyInt_FromLong(value)); -	PyTuple_SetItem(t, n++, PyString_FromString(field_str)); +	PyTuple_SetItem(t, n++, _PyUnicode_FromString(ev_name)); +	PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_name)); +	PyTuple_SetItem(t, n++, _PyLong_FromLong(value)); +	PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_str));  	try_call_object(handler_name, t); @@ -223,10 +253,10 @@ static void define_field(enum print_arg_type field_type,  	if (!t)  		Py_FatalError("couldn't create Python tuple"); -	PyTuple_SetItem(t, n++, PyString_FromString(ev_name)); -	PyTuple_SetItem(t, n++, PyString_FromString(field_name)); +	PyTuple_SetItem(t, n++, _PyUnicode_FromString(ev_name)); +	PyTuple_SetItem(t, n++, _PyUnicode_FromString(field_name));  	if (field_type == PRINT_FLAGS) -		PyTuple_SetItem(t, n++, PyString_FromString(delim)); +		PyTuple_SetItem(t, n++, _PyUnicode_FromString(delim));  	try_call_object(handler_name, t); @@ -325,12 +355,12 @@ static PyObject *get_field_numeric_entry(struct event_format *event,  		if (field->flags & FIELD_IS_SIGNED) {  			if ((long long)val >= LONG_MIN &&  					(long long)val <= LONG_MAX) -				obj = PyInt_FromLong(val); +				obj = _PyLong_FromLong(val);  			else  				obj = PyLong_FromLongLong(val);  		} else {  			if (val <= LONG_MAX) -				obj = PyInt_FromLong(val); +				obj = _PyLong_FromLong(val);  			else  				obj = PyLong_FromUnsignedLongLong(val);  		} @@ -389,9 +419,9 @@ static PyObject *python_process_callchain(struct perf_sample *sample,  			pydict_set_item_string_decref(pysym, "end",  					PyLong_FromUnsignedLongLong(node->sym->end));  			pydict_set_item_string_decref(pysym, "binding", -					PyInt_FromLong(node->sym->binding)); +					_PyLong_FromLong(node->sym->binding));  			pydict_set_item_string_decref(pysym, "name", -					PyString_FromStringAndSize(node->sym->name, +					_PyUnicode_FromStringAndSize(node->sym->name,  							node->sym->namelen));  			pydict_set_item_string_decref(pyelem, "sym", pysym);  		} @@ -406,7 +436,7 @@ static PyObject *python_process_callchain(struct perf_sample *sample,  					dsoname = map->dso->name;  			}  			pydict_set_item_string_decref(pyelem, "dso", -					PyString_FromString(dsoname)); +					_PyUnicode_FromString(dsoname));  		}  		callchain_cursor_advance(&callchain_cursor); @@ -483,16 +513,16 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample,  	if (!dict_sample)  		Py_FatalError("couldn't create Python dictionary"); -	pydict_set_item_string_decref(dict, "ev_name", PyString_FromString(perf_evsel__name(evsel))); -	pydict_set_item_string_decref(dict, "attr", PyString_FromStringAndSize( +	pydict_set_item_string_decref(dict, "ev_name", _PyUnicode_FromString(perf_evsel__name(evsel))); +	pydict_set_item_string_decref(dict, "attr", _PyUnicode_FromStringAndSize(  			(const char *)&evsel->attr, sizeof(evsel->attr)));  	pydict_set_item_string_decref(dict_sample, "pid", -			PyInt_FromLong(sample->pid)); +			_PyLong_FromLong(sample->pid));  	pydict_set_item_string_decref(dict_sample, "tid", -			PyInt_FromLong(sample->tid)); +			_PyLong_FromLong(sample->tid));  	pydict_set_item_string_decref(dict_sample, "cpu", -			PyInt_FromLong(sample->cpu)); +			_PyLong_FromLong(sample->cpu));  	pydict_set_item_string_decref(dict_sample, "ip",  			PyLong_FromUnsignedLongLong(sample->ip));  	pydict_set_item_string_decref(dict_sample, "time", @@ -504,17 +534,17 @@ static PyObject *get_perf_sample_dict(struct perf_sample *sample,  	set_sample_read_in_dict(dict_sample, sample, evsel);  	pydict_set_item_string_decref(dict, "sample", dict_sample); -	pydict_set_item_string_decref(dict, "raw_buf", PyString_FromStringAndSize( +	pydict_set_item_string_decref(dict, "raw_buf", _PyBytes_FromStringAndSize(  			(const char *)sample->raw_data, sample->raw_size));  	pydict_set_item_string_decref(dict, "comm", -			PyString_FromString(thread__comm_str(al->thread))); +			_PyUnicode_FromString(thread__comm_str(al->thread)));  	if (al->map) {  		pydict_set_item_string_decref(dict, "dso", -			PyString_FromString(al->map->dso->name)); +			_PyUnicode_FromString(al->map->dso->name));  	}  	if (al->sym) {  		pydict_set_item_string_decref(dict, "symbol", -			PyString_FromString(al->sym->name)); +			_PyUnicode_FromString(al->sym->name));  	}  	pydict_set_item_string_decref(dict, "callchain", callchain); @@ -574,9 +604,9 @@ static void python_process_tracepoint(struct perf_sample *sample,  	scripting_context->event_data = data;  	scripting_context->pevent = evsel->tp_format->pevent; -	context = PyCObject_FromVoidPtr(scripting_context, NULL); +	context = _PyCapsule_New(scripting_context, NULL, NULL); -	PyTuple_SetItem(t, n++, PyString_FromString(handler_name)); +	PyTuple_SetItem(t, n++, _PyUnicode_FromString(handler_name));  	PyTuple_SetItem(t, n++, context);  	/* ip unwinding */ @@ -585,18 +615,18 @@ static void python_process_tracepoint(struct perf_sample *sample,  	Py_INCREF(callchain);  	if (!dict) { -		PyTuple_SetItem(t, n++, PyInt_FromLong(cpu)); -		PyTuple_SetItem(t, n++, PyInt_FromLong(s)); -		PyTuple_SetItem(t, n++, PyInt_FromLong(ns)); -		PyTuple_SetItem(t, n++, PyInt_FromLong(pid)); -		PyTuple_SetItem(t, n++, PyString_FromString(comm)); +		PyTuple_SetItem(t, n++, _PyLong_FromLong(cpu)); +		PyTuple_SetItem(t, n++, _PyLong_FromLong(s)); +		PyTuple_SetItem(t, n++, _PyLong_FromLong(ns)); +		PyTuple_SetItem(t, n++, _PyLong_FromLong(pid)); +		PyTuple_SetItem(t, n++, _PyUnicode_FromString(comm));  		PyTuple_SetItem(t, n++, callchain);  	} else { -		pydict_set_item_string_decref(dict, "common_cpu", PyInt_FromLong(cpu)); -		pydict_set_item_string_decref(dict, "common_s", PyInt_FromLong(s)); -		pydict_set_item_string_decref(dict, "common_ns", PyInt_FromLong(ns)); -		pydict_set_item_string_decref(dict, "common_pid", PyInt_FromLong(pid)); -		pydict_set_item_string_decref(dict, "common_comm", PyString_FromString(comm)); +		pydict_set_item_string_decref(dict, "common_cpu", _PyLong_FromLong(cpu)); +		pydict_set_item_string_decref(dict, "common_s", _PyLong_FromLong(s)); +		pydict_set_item_string_decref(dict, "common_ns", _PyLong_FromLong(ns)); +		pydict_set_item_string_decref(dict, "common_pid", _PyLong_FromLong(pid)); +		pydict_set_item_string_decref(dict, "common_comm", _PyUnicode_FromString(comm));  		pydict_set_item_string_decref(dict, "common_callchain", callchain);  	}  	for (field = event->format.fields; field; field = field->next) { @@ -615,7 +645,7 @@ static void python_process_tracepoint(struct perf_sample *sample,  			}  			if (field->flags & FIELD_IS_STRING &&  			    is_printable_array(data + offset, len)) { -				obj = PyString_FromString((char *) data + offset); +				obj = _PyUnicode_FromString((char *) data + offset);  			} else {  				obj = PyByteArray_FromStringAndSize((const char *) data + offset, len);  				field->flags &= ~FIELD_IS_STRING; @@ -668,7 +698,7 @@ static PyObject *tuple_new(unsigned int sz)  static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)  {  #if BITS_PER_LONG == 64 -	return PyTuple_SetItem(t, pos, PyInt_FromLong(val)); +	return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));  #endif  #if BITS_PER_LONG == 32  	return PyTuple_SetItem(t, pos, PyLong_FromLongLong(val)); @@ -677,12 +707,12 @@ static int tuple_set_u64(PyObject *t, unsigned int pos, u64 val)  static int tuple_set_s32(PyObject *t, unsigned int pos, s32 val)  { -	return PyTuple_SetItem(t, pos, PyInt_FromLong(val)); +	return PyTuple_SetItem(t, pos, _PyLong_FromLong(val));  }  static int tuple_set_string(PyObject *t, unsigned int pos, const char *s)  { -	return PyTuple_SetItem(t, pos, PyString_FromString(s)); +	return PyTuple_SetItem(t, pos, _PyUnicode_FromString(s));  }  static int python_export_evsel(struct db_export *dbe, struct perf_evsel *evsel) @@ -1029,8 +1059,8 @@ process_stat(struct perf_evsel *counter, int cpu, int thread, u64 tstamp,  		return;  	} -	PyTuple_SetItem(t, n++, PyInt_FromLong(cpu)); -	PyTuple_SetItem(t, n++, PyInt_FromLong(thread)); +	PyTuple_SetItem(t, n++, _PyLong_FromLong(cpu)); +	PyTuple_SetItem(t, n++, _PyLong_FromLong(thread));  	tuple_set_u64(t, n++, tstamp);  	tuple_set_u64(t, n++, count->val); @@ -1212,27 +1242,58 @@ static void set_table_handlers(struct tables *tables)  	SET_TABLE_HANDLER(call_return);  } +#if PY_MAJOR_VERSION < 3 +static void _free_command_line(const char **command_line, int num) +{ +	free(command_line); +} +#else +static void _free_command_line(wchar_t **command_line, int num) +{ +	int i; +	for (i = 0; i < num; i++) +		PyMem_RawFree(command_line[i]); +	free(command_line); +} +#endif + +  /*   * Start trace script   */  static int python_start_script(const char *script, int argc, const char **argv)  {  	struct tables *tables = &tables_global; +#if PY_MAJOR_VERSION < 3  	const char **command_line; +#else +	wchar_t **command_line; +#endif  	char buf[PATH_MAX];  	int i, err = 0;  	FILE *fp; +#if PY_MAJOR_VERSION < 3  	command_line = malloc((argc + 1) * sizeof(const char *));  	command_line[0] = script;  	for (i = 1; i < argc + 1; i++)  		command_line[i] = argv[i - 1]; +#else +	command_line = malloc((argc + 1) * sizeof(wchar_t *)); +	command_line[0] = Py_DecodeLocale(script, NULL); +	for (i = 1; i < argc + 1; i++) +		command_line[i] = Py_DecodeLocale(argv[i - 1], NULL); +#endif  	Py_Initialize(); +#if PY_MAJOR_VERSION < 3  	initperf_trace_context(); -  	PySys_SetArgv(argc + 1, (char **)command_line); +#else +	PyInit_perf_trace_context(); +	PySys_SetArgv(argc + 1, command_line); +#endif  	fp = fopen(script, "r");  	if (!fp) { @@ -1262,12 +1323,12 @@ static int python_start_script(const char *script, int argc, const char **argv)  			goto error;  	} -	free(command_line); +	_free_command_line(command_line, argc + 1);  	return err;  error:  	Py_Finalize(); -	free(command_line); +	_free_command_line(command_line, argc + 1);  	return err;  } | 
