diff options
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/thread.c | 34 |
1 files changed, 30 insertions, 4 deletions
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index c090654cb6c0..21b92162282b 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c | |||
@@ -31,15 +31,41 @@ static struct thread *thread__new(pid_t pid) | |||
31 | return self; | 31 | return self; |
32 | } | 32 | } |
33 | 33 | ||
34 | static void map_groups__flush(struct map_groups *self) | ||
35 | { | ||
36 | int type; | ||
37 | |||
38 | for (type = 0; type < MAP__NR_TYPES; type++) { | ||
39 | struct rb_root *root = &self->maps[type]; | ||
40 | struct rb_node *next = rb_first(root); | ||
41 | |||
42 | while (next) { | ||
43 | struct map *pos = rb_entry(next, struct map, rb_node); | ||
44 | next = rb_next(&pos->rb_node); | ||
45 | rb_erase(&pos->rb_node, root); | ||
46 | /* | ||
47 | * We may have references to this map, for | ||
48 | * instance in some hist_entry instances, so | ||
49 | * just move them to a separate list. | ||
50 | */ | ||
51 | list_add_tail(&pos->node, &self->removed_maps[pos->type]); | ||
52 | } | ||
53 | } | ||
54 | } | ||
55 | |||
34 | int thread__set_comm(struct thread *self, const char *comm) | 56 | int thread__set_comm(struct thread *self, const char *comm) |
35 | { | 57 | { |
58 | int err; | ||
59 | |||
36 | if (self->comm) | 60 | if (self->comm) |
37 | free(self->comm); | 61 | free(self->comm); |
38 | self->comm = strdup(comm); | 62 | self->comm = strdup(comm); |
39 | if (self->comm == NULL) | 63 | err = self->comm == NULL ? -ENOMEM : 0; |
40 | return -ENOMEM; | 64 | if (!err) { |
41 | self->comm_set = true; | 65 | self->comm_set = true; |
42 | return 0; | 66 | map_groups__flush(&self->mg); |
67 | } | ||
68 | return err; | ||
43 | } | 69 | } |
44 | 70 | ||
45 | int thread__comm_len(struct thread *self) | 71 | int thread__comm_len(struct thread *self) |