diff options
Diffstat (limited to 'tools/perf/util/dso.c')
-rw-r--r-- | tools/perf/util/dso.c | 17 |
1 files changed, 17 insertions, 0 deletions
diff --git a/tools/perf/util/dso.c b/tools/perf/util/dso.c index 7c0c08386a1d..425df5c86c9c 100644 --- a/tools/perf/util/dso.c +++ b/tools/perf/util/dso.c | |||
@@ -933,6 +933,7 @@ static struct dso *__dso__findlink_by_longname(struct rb_root *root, | |||
933 | /* Add new node and rebalance tree */ | 933 | /* Add new node and rebalance tree */ |
934 | rb_link_node(&dso->rb_node, parent, p); | 934 | rb_link_node(&dso->rb_node, parent, p); |
935 | rb_insert_color(&dso->rb_node, root); | 935 | rb_insert_color(&dso->rb_node, root); |
936 | dso->root = root; | ||
936 | } | 937 | } |
937 | return NULL; | 938 | return NULL; |
938 | } | 939 | } |
@@ -945,15 +946,30 @@ static inline struct dso *__dso__find_by_longname(struct rb_root *root, | |||
945 | 946 | ||
946 | void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated) | 947 | void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated) |
947 | { | 948 | { |
949 | struct rb_root *root = dso->root; | ||
950 | |||
948 | if (name == NULL) | 951 | if (name == NULL) |
949 | return; | 952 | return; |
950 | 953 | ||
951 | if (dso->long_name_allocated) | 954 | if (dso->long_name_allocated) |
952 | free((char *)dso->long_name); | 955 | free((char *)dso->long_name); |
953 | 956 | ||
957 | if (root) { | ||
958 | rb_erase(&dso->rb_node, root); | ||
959 | /* | ||
960 | * __dso__findlink_by_longname() isn't guaranteed to add it | ||
961 | * back, so a clean removal is required here. | ||
962 | */ | ||
963 | RB_CLEAR_NODE(&dso->rb_node); | ||
964 | dso->root = NULL; | ||
965 | } | ||
966 | |||
954 | dso->long_name = name; | 967 | dso->long_name = name; |
955 | dso->long_name_len = strlen(name); | 968 | dso->long_name_len = strlen(name); |
956 | dso->long_name_allocated = name_allocated; | 969 | dso->long_name_allocated = name_allocated; |
970 | |||
971 | if (root) | ||
972 | __dso__findlink_by_longname(root, dso, NULL); | ||
957 | } | 973 | } |
958 | 974 | ||
959 | void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated) | 975 | void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated) |
@@ -1046,6 +1062,7 @@ struct dso *dso__new(const char *name) | |||
1046 | dso->kernel = DSO_TYPE_USER; | 1062 | dso->kernel = DSO_TYPE_USER; |
1047 | dso->needs_swap = DSO_SWAP__UNSET; | 1063 | dso->needs_swap = DSO_SWAP__UNSET; |
1048 | RB_CLEAR_NODE(&dso->rb_node); | 1064 | RB_CLEAR_NODE(&dso->rb_node); |
1065 | dso->root = NULL; | ||
1049 | INIT_LIST_HEAD(&dso->node); | 1066 | INIT_LIST_HEAD(&dso->node); |
1050 | INIT_LIST_HEAD(&dso->data.open_entry); | 1067 | INIT_LIST_HEAD(&dso->data.open_entry); |
1051 | pthread_mutex_init(&dso->lock, NULL); | 1068 | pthread_mutex_init(&dso->lock, NULL); |