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>
This commit is contained in:
parent
10fe12ef63
commit
faa5c5c36e
|
@ -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)
|
||||
|
|
|
@ -15,6 +15,7 @@ struct thread {
|
|||
struct map_groups mg;
|
||||
pid_t pid;
|
||||
char shortname[3];
|
||||
bool comm_set;
|
||||
char *comm;
|
||||
int comm_len;
|
||||
};
|
||||
|
|
Loading…
Reference in New Issue