diff options
Diffstat (limited to 'tools/perf/util')
-rw-r--r-- | tools/perf/util/event.c | 13 | ||||
-rw-r--r-- | tools/perf/util/hist.c | 2 | ||||
-rw-r--r-- | tools/perf/util/scripting-engines/trace-event-python.c | 50 |
3 files changed, 39 insertions, 26 deletions
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 50771b5813ee..1f08f008d289 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
@@ -370,9 +370,9 @@ static int thread__set_comm_adjust(struct thread *self, const char *comm) | |||
370 | 370 | ||
371 | int event__process_comm(event_t *self, struct perf_session *session) | 371 | int event__process_comm(event_t *self, struct perf_session *session) |
372 | { | 372 | { |
373 | struct thread *thread = perf_session__findnew(session, self->comm.pid); | 373 | struct thread *thread = perf_session__findnew(session, self->comm.tid); |
374 | 374 | ||
375 | dump_printf(": %s:%d\n", self->comm.comm, self->comm.pid); | 375 | dump_printf(": %s:%d\n", self->comm.comm, self->comm.tid); |
376 | 376 | ||
377 | if (thread == NULL || thread__set_comm_adjust(thread, self->comm.comm)) { | 377 | if (thread == NULL || thread__set_comm_adjust(thread, self->comm.comm)) { |
378 | dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); | 378 | dump_printf("problem processing PERF_RECORD_COMM, skipping event.\n"); |
@@ -532,16 +532,11 @@ out_problem: | |||
532 | 532 | ||
533 | int event__process_task(event_t *self, struct perf_session *session) | 533 | int event__process_task(event_t *self, struct perf_session *session) |
534 | { | 534 | { |
535 | struct thread *thread = perf_session__findnew(session, self->fork.pid); | 535 | struct thread *thread = perf_session__findnew(session, self->fork.tid); |
536 | struct thread *parent = perf_session__findnew(session, self->fork.ppid); | 536 | struct thread *parent = perf_session__findnew(session, self->fork.ptid); |
537 | 537 | ||
538 | dump_printf("(%d:%d):(%d:%d)\n", self->fork.pid, self->fork.tid, | 538 | dump_printf("(%d:%d):(%d:%d)\n", self->fork.pid, self->fork.tid, |
539 | self->fork.ppid, self->fork.ptid); | 539 | self->fork.ppid, self->fork.ptid); |
540 | /* | ||
541 | * A thread clone will have the same PID for both parent and child. | ||
542 | */ | ||
543 | if (thread == parent) | ||
544 | return 0; | ||
545 | 540 | ||
546 | if (self->header.type == PERF_RECORD_EXIT) | 541 | if (self->header.type == PERF_RECORD_EXIT) |
547 | return 0; | 542 | return 0; |
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index cbf7eae2ce09..07f89b66b318 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c | |||
@@ -965,7 +965,7 @@ static int hist_entry__parse_objdump_line(struct hist_entry *self, FILE *file, | |||
965 | * Parse hexa addresses followed by ':' | 965 | * Parse hexa addresses followed by ':' |
966 | */ | 966 | */ |
967 | line_ip = strtoull(tmp, &tmp2, 16); | 967 | line_ip = strtoull(tmp, &tmp2, 16); |
968 | if (*tmp2 != ':') | 968 | if (*tmp2 != ':' || tmp == tmp2) |
969 | line_ip = -1; | 969 | line_ip = -1; |
970 | } | 970 | } |
971 | 971 | ||
diff --git a/tools/perf/util/scripting-engines/trace-event-python.c b/tools/perf/util/scripting-engines/trace-event-python.c index 81f39cab3aaa..33a632523743 100644 --- a/tools/perf/util/scripting-engines/trace-event-python.c +++ b/tools/perf/util/scripting-engines/trace-event-python.c | |||
@@ -208,7 +208,7 @@ static void python_process_event(int cpu, void *data, | |||
208 | int size __unused, | 208 | int size __unused, |
209 | unsigned long long nsecs, char *comm) | 209 | unsigned long long nsecs, char *comm) |
210 | { | 210 | { |
211 | PyObject *handler, *retval, *context, *t, *obj; | 211 | PyObject *handler, *retval, *context, *t, *obj, *dict = NULL; |
212 | static char handler_name[256]; | 212 | static char handler_name[256]; |
213 | struct format_field *field; | 213 | struct format_field *field; |
214 | unsigned long long val; | 214 | unsigned long long val; |
@@ -232,6 +232,14 @@ static void python_process_event(int cpu, void *data, | |||
232 | 232 | ||
233 | sprintf(handler_name, "%s__%s", event->system, event->name); | 233 | sprintf(handler_name, "%s__%s", event->system, event->name); |
234 | 234 | ||
235 | handler = PyDict_GetItemString(main_dict, handler_name); | ||
236 | if (handler && !PyCallable_Check(handler)) | ||
237 | handler = NULL; | ||
238 | if (!handler) { | ||
239 | dict = PyDict_New(); | ||
240 | if (!dict) | ||
241 | Py_FatalError("couldn't create Python dict"); | ||
242 | } | ||
235 | s = nsecs / NSECS_PER_SEC; | 243 | s = nsecs / NSECS_PER_SEC; |
236 | ns = nsecs - s * NSECS_PER_SEC; | 244 | ns = nsecs - s * NSECS_PER_SEC; |
237 | 245 | ||
@@ -242,12 +250,20 @@ static void python_process_event(int cpu, void *data, | |||
242 | PyTuple_SetItem(t, n++, PyString_FromString(handler_name)); | 250 | PyTuple_SetItem(t, n++, PyString_FromString(handler_name)); |
243 | PyTuple_SetItem(t, n++, | 251 | PyTuple_SetItem(t, n++, |
244 | PyCObject_FromVoidPtr(scripting_context, NULL)); | 252 | PyCObject_FromVoidPtr(scripting_context, NULL)); |
245 | PyTuple_SetItem(t, n++, PyInt_FromLong(cpu)); | ||
246 | PyTuple_SetItem(t, n++, PyInt_FromLong(s)); | ||
247 | PyTuple_SetItem(t, n++, PyInt_FromLong(ns)); | ||
248 | PyTuple_SetItem(t, n++, PyInt_FromLong(pid)); | ||
249 | PyTuple_SetItem(t, n++, PyString_FromString(comm)); | ||
250 | 253 | ||
254 | if (handler) { | ||
255 | PyTuple_SetItem(t, n++, PyInt_FromLong(cpu)); | ||
256 | PyTuple_SetItem(t, n++, PyInt_FromLong(s)); | ||
257 | PyTuple_SetItem(t, n++, PyInt_FromLong(ns)); | ||
258 | PyTuple_SetItem(t, n++, PyInt_FromLong(pid)); | ||
259 | PyTuple_SetItem(t, n++, PyString_FromString(comm)); | ||
260 | } else { | ||
261 | PyDict_SetItemString(dict, "common_cpu", PyInt_FromLong(cpu)); | ||
262 | PyDict_SetItemString(dict, "common_s", PyInt_FromLong(s)); | ||
263 | PyDict_SetItemString(dict, "common_ns", PyInt_FromLong(ns)); | ||
264 | PyDict_SetItemString(dict, "common_pid", PyInt_FromLong(pid)); | ||
265 | PyDict_SetItemString(dict, "common_comm", PyString_FromString(comm)); | ||
266 | } | ||
251 | for (field = event->format.fields; field; field = field->next) { | 267 | for (field = event->format.fields; field; field = field->next) { |
252 | if (field->flags & FIELD_IS_STRING) { | 268 | if (field->flags & FIELD_IS_STRING) { |
253 | int offset; | 269 | int offset; |
@@ -272,27 +288,31 @@ static void python_process_event(int cpu, void *data, | |||
272 | obj = PyLong_FromUnsignedLongLong(val); | 288 | obj = PyLong_FromUnsignedLongLong(val); |
273 | } | 289 | } |
274 | } | 290 | } |
275 | PyTuple_SetItem(t, n++, obj); | 291 | if (handler) |
292 | PyTuple_SetItem(t, n++, obj); | ||
293 | else | ||
294 | PyDict_SetItemString(dict, field->name, obj); | ||
295 | |||
276 | } | 296 | } |
297 | if (!handler) | ||
298 | PyTuple_SetItem(t, n++, dict); | ||
277 | 299 | ||
278 | if (_PyTuple_Resize(&t, n) == -1) | 300 | if (_PyTuple_Resize(&t, n) == -1) |
279 | Py_FatalError("error resizing Python tuple"); | 301 | Py_FatalError("error resizing Python tuple"); |
280 | 302 | ||
281 | handler = PyDict_GetItemString(main_dict, handler_name); | 303 | if (handler) { |
282 | if (handler && PyCallable_Check(handler)) { | ||
283 | retval = PyObject_CallObject(handler, t); | 304 | retval = PyObject_CallObject(handler, t); |
284 | if (retval == NULL) | 305 | if (retval == NULL) |
285 | handler_call_die(handler_name); | 306 | handler_call_die(handler_name); |
286 | } else { | 307 | } else { |
287 | handler = PyDict_GetItemString(main_dict, "trace_unhandled"); | 308 | handler = PyDict_GetItemString(main_dict, "trace_unhandled"); |
288 | if (handler && PyCallable_Check(handler)) { | 309 | if (handler && PyCallable_Check(handler)) { |
289 | if (_PyTuple_Resize(&t, N_COMMON_FIELDS) == -1) | ||
290 | Py_FatalError("error resizing Python tuple"); | ||
291 | 310 | ||
292 | retval = PyObject_CallObject(handler, t); | 311 | retval = PyObject_CallObject(handler, t); |
293 | if (retval == NULL) | 312 | if (retval == NULL) |
294 | handler_call_die("trace_unhandled"); | 313 | handler_call_die("trace_unhandled"); |
295 | } | 314 | } |
315 | Py_DECREF(dict); | ||
296 | } | 316 | } |
297 | 317 | ||
298 | Py_DECREF(t); | 318 | Py_DECREF(t); |
@@ -548,12 +568,10 @@ static int python_generate_script(const char *outfile) | |||
548 | } | 568 | } |
549 | 569 | ||
550 | fprintf(ofp, "def trace_unhandled(event_name, context, " | 570 | fprintf(ofp, "def trace_unhandled(event_name, context, " |
551 | "common_cpu, common_secs, common_nsecs,\n\t\t" | 571 | "event_fields_dict):\n"); |
552 | "common_pid, common_comm):\n"); | ||
553 | 572 | ||
554 | fprintf(ofp, "\t\tprint_header(event_name, common_cpu, " | 573 | fprintf(ofp, "\t\tprint ' '.join(['%%s=%%s'%%(k,str(v))" |
555 | "common_secs, common_nsecs,\n\t\tcommon_pid, " | 574 | "for k,v in sorted(event_fields_dict.items())])\n\n"); |
556 | "common_comm)\n\n"); | ||
557 | 575 | ||
558 | fprintf(ofp, "def print_header(" | 576 | fprintf(ofp, "def print_header(" |
559 | "event_name, cpu, secs, nsecs, pid, comm):\n" | 577 | "event_name, cpu, secs, nsecs, pid, comm):\n" |