|
@@ -272,6 +272,52 @@ void machines__set_id_hdr_size(struct machines *machines, u16 id_hdr_size)
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+static void machine__update_thread_pid(struct machine *machine,
|
|
|
+ struct thread *th, pid_t pid)
|
|
|
+{
|
|
|
+ struct thread *leader;
|
|
|
+
|
|
|
+ if (pid == th->pid_ || pid == -1 || th->pid_ != -1)
|
|
|
+ return;
|
|
|
+
|
|
|
+ th->pid_ = pid;
|
|
|
+
|
|
|
+ if (th->pid_ == th->tid)
|
|
|
+ return;
|
|
|
+
|
|
|
+ leader = machine__findnew_thread(machine, th->pid_, th->pid_);
|
|
|
+ if (!leader)
|
|
|
+ goto out_err;
|
|
|
+
|
|
|
+ if (!leader->mg)
|
|
|
+ leader->mg = map_groups__new();
|
|
|
+
|
|
|
+ if (!leader->mg)
|
|
|
+ goto out_err;
|
|
|
+
|
|
|
+ if (th->mg == leader->mg)
|
|
|
+ return;
|
|
|
+
|
|
|
+ if (th->mg) {
|
|
|
+ /*
|
|
|
+ * Maps are created from MMAP events which provide the pid and
|
|
|
+ * tid. Consequently there never should be any maps on a thread
|
|
|
+ * with an unknown pid. Just print an error if there are.
|
|
|
+ */
|
|
|
+ if (!map_groups__empty(th->mg))
|
|
|
+ pr_err("Discarding thread maps for %d:%d\n",
|
|
|
+ th->pid_, th->tid);
|
|
|
+ map_groups__delete(th->mg);
|
|
|
+ }
|
|
|
+
|
|
|
+ th->mg = map_groups__get(leader->mg);
|
|
|
+
|
|
|
+ return;
|
|
|
+
|
|
|
+out_err:
|
|
|
+ pr_err("Failed to join map groups for %d:%d\n", th->pid_, th->tid);
|
|
|
+}
|
|
|
+
|
|
|
static struct thread *__machine__findnew_thread(struct machine *machine,
|
|
|
pid_t pid, pid_t tid,
|
|
|
bool create)
|
|
@@ -285,10 +331,10 @@ static struct thread *__machine__findnew_thread(struct machine *machine,
|
|
|
* so most of the time we dont have to look up
|
|
|
* the full rbtree:
|
|
|
*/
|
|
|
- if (machine->last_match && machine->last_match->tid == tid) {
|
|
|
- if (pid != -1 && pid != machine->last_match->pid_)
|
|
|
- machine->last_match->pid_ = pid;
|
|
|
- return machine->last_match;
|
|
|
+ th = machine->last_match;
|
|
|
+ if (th && th->tid == tid) {
|
|
|
+ machine__update_thread_pid(machine, th, pid);
|
|
|
+ return th;
|
|
|
}
|
|
|
|
|
|
while (*p != NULL) {
|
|
@@ -297,8 +343,7 @@ static struct thread *__machine__findnew_thread(struct machine *machine,
|
|
|
|
|
|
if (th->tid == tid) {
|
|
|
machine->last_match = th;
|
|
|
- if (pid != -1 && pid != th->pid_)
|
|
|
- th->pid_ = pid;
|
|
|
+ machine__update_thread_pid(machine, th, pid);
|
|
|
return th;
|
|
|
}
|
|
|
|