aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2010-02-19 20:02:07 -0500
committerIngo Molnar <mingo@elte.hu>2010-02-21 11:48:24 -0500
commitfaa5c5c36ec50bf43e39c7798ce9701e6b002db3 (patch)
treebd021ed5888ad9d264418c5d3acba4a3f757d57c /tools
parent10fe12ef631a7e85022ed26304a37f033a6a95b8 (diff)
perf tools: Don't use parent comm if not set at fork time
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. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frédéric Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> LKML-Reference: <1266627727-19715-1-git-send-email-acme@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/util/thread.c18
-rw-r--r--tools/perf/util/thread.h1
2 files changed, 13 insertions, 6 deletions
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c
index 634b7f7140d5..9e8995eaf2b6 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)
36 if (self->comm) 36 if (self->comm)
37 free(self->comm); 37 free(self->comm);
38 self->comm = strdup(comm); 38 self->comm = strdup(comm);
39 return self->comm ? 0 : -ENOMEM; 39 if (self->comm == NULL)
40 return -ENOMEM;
41 self->comm_set = true;
42 return 0;
40} 43}
41 44
42int thread__comm_len(struct thread *self) 45int thread__comm_len(struct thread *self)
@@ -255,11 +258,14 @@ int thread__fork(struct thread *self, struct thread *parent)
255{ 258{
256 int i; 259 int i;
257 260
258 if (self->comm) 261 if (parent->comm_set) {
259 free(self->comm); 262 if (self->comm)
260 self->comm = strdup(parent->comm); 263 free(self->comm);
261 if (!self->comm) 264 self->comm = strdup(parent->comm);
262 return -ENOMEM; 265 if (!self->comm)
266 return -ENOMEM;
267 self->comm_set = true;
268 }
263 269
264 for (i = 0; i < MAP__NR_TYPES; ++i) 270 for (i = 0; i < MAP__NR_TYPES; ++i)
265 if (map_groups__clone(&self->mg, &parent->mg, i) < 0) 271 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 56f317b8a06c..0a28f39de545 100644
--- a/tools/perf/util/thread.h
+++ b/tools/perf/util/thread.h
@@ -15,6 +15,7 @@ struct thread {
15 struct map_groups mg; 15 struct map_groups mg;
16 pid_t pid; 16 pid_t pid;
17 char shortname[3]; 17 char shortname[3];
18 bool comm_set;
18 char *comm; 19 char *comm;
19 int comm_len; 20 int comm_len;
20}; 21};