diff options
Diffstat (limited to 'tools/perf/util/session.c')
| -rw-r--r-- | tools/perf/util/session.c | 26 | 
1 files changed, 26 insertions, 0 deletions
| diff --git a/tools/perf/util/session.c b/tools/perf/util/session.c index 8cbea122e349..04a3b3db9e90 100644 --- a/tools/perf/util/session.c +++ b/tools/perf/util/session.c | |||
| @@ -124,9 +124,35 @@ out_delete: | |||
| 124 | return NULL; | 124 | return NULL; | 
| 125 | } | 125 | } | 
| 126 | 126 | ||
| 127 | static void perf_session__delete_dead_threads(struct perf_session *self) | ||
| 128 | { | ||
| 129 | struct thread *n, *t; | ||
| 130 | |||
| 131 | list_for_each_entry_safe(t, n, &self->dead_threads, node) { | ||
| 132 | list_del(&t->node); | ||
| 133 | thread__delete(t); | ||
| 134 | } | ||
| 135 | } | ||
| 136 | |||
| 137 | static void perf_session__delete_threads(struct perf_session *self) | ||
| 138 | { | ||
| 139 | struct rb_node *nd = rb_first(&self->threads); | ||
| 140 | |||
| 141 | while (nd) { | ||
| 142 | struct thread *t = rb_entry(nd, struct thread, rb_node); | ||
| 143 | |||
| 144 | rb_erase(&t->rb_node, &self->threads); | ||
| 145 | nd = rb_next(nd); | ||
| 146 | thread__delete(t); | ||
| 147 | } | ||
| 148 | } | ||
| 149 | |||
| 127 | void perf_session__delete(struct perf_session *self) | 150 | void perf_session__delete(struct perf_session *self) | 
| 128 | { | 151 | { | 
| 129 | perf_header__exit(&self->header); | 152 | perf_header__exit(&self->header); | 
| 153 | perf_session__delete_dead_threads(self); | ||
| 154 | perf_session__delete_threads(self); | ||
| 155 | machine__exit(&self->host_machine); | ||
| 130 | close(self->fd); | 156 | close(self->fd); | 
| 131 | free(self); | 157 | free(self); | 
| 132 | } | 158 | } | 
