|
@@ -253,7 +253,8 @@ void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
-static struct thread *__machine__findnew_thread(struct machine *machine, pid_t tid,
|
|
|
+static struct thread *__machine__findnew_thread(struct machine *machine,
|
|
|
+ pid_t pid, pid_t tid,
|
|
|
bool create)
|
|
|
{
|
|
|
struct rb_node **p = &machine->threads.rb_node;
|
|
@@ -265,8 +266,11 @@ static struct thread *__machine__findnew_thread(struct machine *machine, pid_t t
|
|
|
* so most of the time we dont have to look up
|
|
|
* the full rbtree:
|
|
|
*/
|
|
|
- if (machine->last_match && machine->last_match->tid == tid)
|
|
|
+ if (machine->last_match && machine->last_match->tid == tid) {
|
|
|
+ if (pid && pid != machine->last_match->pid_)
|
|
|
+ machine->last_match->pid_ = pid;
|
|
|
return machine->last_match;
|
|
|
+ }
|
|
|
|
|
|
while (*p != NULL) {
|
|
|
parent = *p;
|
|
@@ -274,6 +278,8 @@ static struct thread *__machine__findnew_thread(struct machine *machine, pid_t t
|
|
|
|
|
|
if (th->tid == tid) {
|
|
|
machine->last_match = th;
|
|
|
+ if (pid && pid != th->pid_)
|
|
|
+ th->pid_ = pid;
|
|
|
return th;
|
|
|
}
|
|
|
|
|
@@ -286,7 +292,7 @@ static struct thread *__machine__findnew_thread(struct machine *machine, pid_t t
|
|
|
if (!create)
|
|
|
return NULL;
|
|
|
|
|
|
- th = thread__new(tid);
|
|
|
+ th = thread__new(pid, tid);
|
|
|
if (th != NULL) {
|
|
|
rb_link_node(&th->rb_node, parent, p);
|
|
|
rb_insert_color(&th->rb_node, &machine->threads);
|
|
@@ -298,12 +304,12 @@ static struct thread *__machine__findnew_thread(struct machine *machine, pid_t t
|
|
|
|
|
|
struct thread *machine__findnew_thread(struct machine *machine, pid_t tid)
|
|
|
{
|
|
|
- return __machine__findnew_thread(machine, tid, true);
|
|
|
+ return __machine__findnew_thread(machine, 0, tid, true);
|
|
|
}
|
|
|
|
|
|
struct thread *machine__find_thread(struct machine *machine, pid_t tid)
|
|
|
{
|
|
|
- return __machine__findnew_thread(machine, tid, false);
|
|
|
+ return __machine__findnew_thread(machine, 0, tid, false);
|
|
|
}
|
|
|
|
|
|
int machine__process_comm_event(struct machine *machine, union perf_event *event)
|