From: Arnaldo Carvalho de Melo <[email protected]>
As the parent comm then is worthless, confusing users about the thread where
the sample really happened, leading to think that the sample happened in the
parent, not where it really happened, in the children of a thread for which a
PERF_RECORD_COMM event was not received.
Cc: Frédéric Weisbecker <[email protected]>
Cc: Mike Galbraith <[email protected]>
Cc: Peter Zijlstra <[email protected]>
Cc: Paul Mackerras <[email protected]>
Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
---
tools/perf/util/thread.c | 18 ++++++++++++------
tools/perf/util/thread.h | 1 +
2 files changed, 13 insertions(+), 6 deletions(-)
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c
index 634b7f7..9e8995e 100644
--- a/tools/perf/util/thread.c
+++ b/tools/perf/util/thread.c
@@ -36,7 +36,10 @@ int thread__set_comm(struct thread *self, const char *comm)
if (self->comm)
free(self->comm);
self->comm = strdup(comm);
- return self->comm ? 0 : -ENOMEM;
+ if (self->comm == NULL)
+ return -ENOMEM;
+ self->comm_set = true;
+ return 0;
}
int thread__comm_len(struct thread *self)
@@ -255,11 +258,14 @@ int thread__fork(struct thread *self, struct thread *parent)
{
int i;
- if (self->comm)
- free(self->comm);
- self->comm = strdup(parent->comm);
- if (!self->comm)
- return -ENOMEM;
+ if (parent->comm_set) {
+ if (self->comm)
+ free(self->comm);
+ self->comm = strdup(parent->comm);
+ if (!self->comm)
+ return -ENOMEM;
+ self->comm_set = true;
+ }
for (i = 0; i < MAP__NR_TYPES; ++i)
if (map_groups__clone(&self->mg, &parent->mg, i) < 0)
diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h
index 56f317b..0a28f39 100644
--- a/tools/perf/util/thread.h
+++ b/tools/perf/util/thread.h
@@ -15,6 +15,7 @@ struct thread {
struct map_groups mg;
pid_t pid;
char shortname[3];
+ bool comm_set;
char *comm;
int comm_len;
};
--
1.5.5.1