diff options
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/util/event.c | 4 | ||||
-rw-r--r-- | tools/perf/util/session.c | 11 | ||||
-rw-r--r-- | tools/perf/util/session.h | 2 | ||||
-rw-r--r-- | tools/perf/util/thread.h | 5 |
4 files changed, 20 insertions, 2 deletions
diff --git a/tools/perf/util/event.c b/tools/perf/util/event.c index 1f08f008d289..2fbf6a463c81 100644 --- a/tools/perf/util/event.c +++ b/tools/perf/util/event.c | |||
@@ -538,8 +538,10 @@ int event__process_task(event_t *self, struct perf_session *session) | |||
538 | dump_printf("(%d:%d):(%d:%d)\n", self->fork.pid, self->fork.tid, | 538 | dump_printf("(%d:%d):(%d:%d)\n", self->fork.pid, self->fork.tid, |
539 | self->fork.ppid, self->fork.ptid); | 539 | self->fork.ppid, self->fork.ptid); |
540 | 540 | ||
541 | if (self->header.type == PERF_RECORD_EXIT) | 541 | if (self->header.type == PERF_RECORD_EXIT) { |
542 | perf_session__remove_thread(session, thread); | ||
542 | return 0; | 543 | return 0; |
544 | } | ||
543 | 545 | ||
544 | if (thread == NULL || parent == NULL || | 546 | if (thread == NULL || parent == NULL || |
545 | thread__fork(thread, parent) < 0) { | 547 | thread__fork(thread, parent) < 0) { |
diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 8f83a1835766..c422cd676313 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
@@ -90,6 +90,7 @@ struct perf_session *perf_session__new(const char *filename, int mode, bool forc | |||
90 | 90 | ||
91 | memcpy(self->filename, filename, len); | 91 | memcpy(self->filename, filename, len); |
92 | self->threads = RB_ROOT; | 92 | self->threads = RB_ROOT; |
93 | INIT_LIST_HEAD(&self->dead_threads); | ||
93 | self->hists_tree = RB_ROOT; | 94 | self->hists_tree = RB_ROOT; |
94 | self->last_match = NULL; | 95 | self->last_match = NULL; |
95 | self->mmap_window = 32; | 96 | self->mmap_window = 32; |
@@ -131,6 +132,16 @@ void perf_session__delete(struct perf_session *self) | |||
131 | free(self); | 132 | free(self); |
132 | } | 133 | } |
133 | 134 | ||
135 | void perf_session__remove_thread(struct perf_session *self, struct thread *th) | ||
136 | { | ||
137 | rb_erase(&th->rb_node, &self->threads); | ||
138 | /* | ||
139 | * We may have references to this thread, for instance in some hist_entry | ||
140 | * instances, so just move them to a separate list. | ||
141 | */ | ||
142 | list_add_tail(&th->node, &self->dead_threads); | ||
143 | } | ||
144 | |||
134 | static bool symbol__match_parent_regex(struct symbol *sym) | 145 | static bool symbol__match_parent_regex(struct symbol *sym) |
135 | { | 146 | { |
136 | if (sym->name && !regexec(&parent_regex, sym->name, 0, NULL, 0)) | 147 | if (sym->name && !regexec(&parent_regex, sym->name, 0, NULL, 0)) |
diff --git a/tools/perf/util/session.h b/tools/perf/util/session.h index 55c6881b218d..9fa0fc2a863f 100644 --- a/tools/perf/util/session.h +++ b/tools/perf/util/session.h | |||
@@ -26,6 +26,7 @@ struct perf_session { | |||
26 | unsigned long size; | 26 | unsigned long size; |
27 | unsigned long mmap_window; | 27 | unsigned long mmap_window; |
28 | struct rb_root threads; | 28 | struct rb_root threads; |
29 | struct list_head dead_threads; | ||
29 | struct thread *last_match; | 30 | struct thread *last_match; |
30 | struct machine host_machine; | 31 | struct machine host_machine; |
31 | struct rb_root machines; | 32 | struct rb_root machines; |
@@ -99,6 +100,7 @@ int perf_session__create_kernel_maps(struct perf_session *self); | |||
99 | 100 | ||
100 | int do_read(int fd, void *buf, size_t size); | 101 | int do_read(int fd, void *buf, size_t size); |
101 | void perf_session__update_sample_type(struct perf_session *self); | 102 | void perf_session__update_sample_type(struct perf_session *self); |
103 | void perf_session__remove_thread(struct perf_session *self, struct thread *th); | ||
102 | 104 | ||
103 | static inline | 105 | static inline |
104 | struct machine *perf_session__find_host_machine(struct perf_session *self) | 106 | struct machine *perf_session__find_host_machine(struct perf_session *self) |
diff --git a/tools/perf/util/thread.h b/tools/perf/util/thread.h index 1dfd9ff8bdcd..ee6bbcf277ca 100644 --- a/tools/perf/util/thread.h +++ b/tools/perf/util/thread.h | |||
@@ -6,7 +6,10 @@ | |||
6 | #include "symbol.h" | 6 | #include "symbol.h" |
7 | 7 | ||
8 | struct thread { | 8 | struct thread { |
9 | struct rb_node rb_node; | 9 | union { |
10 | struct rb_node rb_node; | ||
11 | struct list_head node; | ||
12 | }; | ||
10 | struct map_groups mg; | 13 | struct map_groups mg; |
11 | pid_t pid; | 14 | pid_t pid; |
12 | char shortname[3]; | 15 | char shortname[3]; |