perf tools: Change strlist to use the new rblist

Replaces the direct use of rbtree code with the rblist API. In the end
the patch is a no-op on strlist functionality; the API for strlist is
not changed, only its implementaton.

Signed-off-by: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1343709095-7089-3-git-send-email-dsahern@gmail.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by David Ahern and committed by Arnaldo Carvalho de Melo ee8dd3ca 37bbd3ff

+58 -85
+52 -80
tools/perf/util/strlist.c
··· 10 10 #include <stdlib.h> 11 11 #include <string.h> 12 12 13 - static struct str_node *str_node__new(const char *s, bool dupstr) 13 + static 14 + struct rb_node *strlist__node_new(struct rblist *rblist, const void *entry) 14 15 { 15 - struct str_node *self = malloc(sizeof(*self)); 16 + const char *s = entry; 17 + struct rb_node *rc = NULL; 18 + struct strlist *strlist = container_of(rblist, struct strlist, rblist); 19 + struct str_node *snode = malloc(sizeof(*snode)); 16 20 17 - if (self != NULL) { 18 - if (dupstr) { 21 + if (snode != NULL) { 22 + if (strlist->dupstr) { 19 23 s = strdup(s); 20 24 if (s == NULL) 21 25 goto out_delete; 22 26 } 23 - self->s = s; 27 + snode->s = s; 28 + rc = &snode->rb_node; 24 29 } 25 30 26 - return self; 31 + return rc; 27 32 28 33 out_delete: 29 - free(self); 34 + free(snode); 30 35 return NULL; 31 36 } 32 37 ··· 42 37 free(self); 43 38 } 44 39 40 + static 41 + void strlist__node_delete(struct rblist *rblist, struct rb_node *rb_node) 42 + { 43 + struct strlist *slist = container_of(rblist, struct strlist, rblist); 44 + struct str_node *snode = container_of(rb_node, struct str_node, rb_node); 45 + 46 + str_node__delete(snode, slist->dupstr); 47 + } 48 + 49 + static int strlist__node_cmp(struct rb_node *rb_node, const void *entry) 50 + { 51 + const char *str = entry; 52 + struct str_node *snode = container_of(rb_node, struct str_node, rb_node); 53 + 54 + return strcmp(snode->s, str); 55 + } 56 + 45 57 int strlist__add(struct strlist *self, const char *new_entry) 46 58 { 47 - struct rb_node **p = &self->entries.rb_node; 48 - struct rb_node *parent = NULL; 49 - struct str_node *sn; 50 - 51 - while (*p != NULL) { 52 - int rc; 53 - 54 - parent = *p; 55 - sn = rb_entry(parent, struct str_node, rb_node); 56 - rc = strcmp(sn->s, new_entry); 57 - 58 - if (rc > 0) 59 - p = &(*p)->rb_left; 60 - else if (rc < 0) 61 - p = &(*p)->rb_right; 62 - else 63 - return -EEXIST; 64 - } 65 - 66 - sn = str_node__new(new_entry, self->dupstr); 67 - if (sn == NULL) 68 - return -ENOMEM; 69 - 70 - rb_link_node(&sn->rb_node, parent, p); 71 - rb_insert_color(&sn->rb_node, &self->entries); 72 - ++self->nr_entries; 73 - 74 - return 0; 59 + return rblist__add_node(&self->rblist, new_entry); 75 60 } 76 61 77 62 int strlist__load(struct strlist *self, const char *filename) ··· 91 96 return err; 92 97 } 93 98 94 - void strlist__remove(struct strlist *self, struct str_node *sn) 99 + void strlist__remove(struct strlist *slist, struct str_node *snode) 95 100 { 96 - rb_erase(&sn->rb_node, &self->entries); 97 - str_node__delete(sn, self->dupstr); 101 + str_node__delete(snode, slist->dupstr); 98 102 } 99 103 100 - struct str_node *strlist__find(struct strlist *self, const char *entry) 104 + struct str_node *strlist__find(struct strlist *slist, const char *entry) 101 105 { 102 - struct rb_node **p = &self->entries.rb_node; 103 - struct rb_node *parent = NULL; 106 + struct str_node *snode = NULL; 107 + struct rb_node *rb_node = rblist__find(&slist->rblist, entry); 104 108 105 - while (*p != NULL) { 106 - struct str_node *sn; 107 - int rc; 109 + if (rb_node) 110 + snode = container_of(rb_node, struct str_node, rb_node); 108 111 109 - parent = *p; 110 - sn = rb_entry(parent, struct str_node, rb_node); 111 - rc = strcmp(sn->s, entry); 112 - 113 - if (rc > 0) 114 - p = &(*p)->rb_left; 115 - else if (rc < 0) 116 - p = &(*p)->rb_right; 117 - else 118 - return sn; 119 - } 120 - 121 - return NULL; 112 + return snode; 122 113 } 123 114 124 115 static int strlist__parse_list_entry(struct strlist *self, const char *s) ··· 137 156 struct strlist *self = malloc(sizeof(*self)); 138 157 139 158 if (self != NULL) { 140 - self->entries = RB_ROOT; 159 + rblist__init(&self->rblist); 160 + self->rblist.node_cmp = strlist__node_cmp; 161 + self->rblist.node_new = strlist__node_new; 162 + self->rblist.node_delete = strlist__node_delete; 163 + 141 164 self->dupstr = dupstr; 142 - self->nr_entries = 0; 143 165 if (slist && strlist__parse_list(self, slist) != 0) 144 166 goto out_error; 145 167 } ··· 155 171 156 172 void strlist__delete(struct strlist *self) 157 173 { 158 - if (self != NULL) { 159 - struct str_node *pos; 160 - struct rb_node *next = rb_first(&self->entries); 161 - 162 - while (next) { 163 - pos = rb_entry(next, struct str_node, rb_node); 164 - next = rb_next(&pos->rb_node); 165 - strlist__remove(self, pos); 166 - } 167 - self->entries = RB_ROOT; 168 - free(self); 169 - } 174 + if (self != NULL) 175 + rblist__delete(&self->rblist); 170 176 } 171 177 172 - struct str_node *strlist__entry(const struct strlist *self, unsigned int idx) 178 + struct str_node *strlist__entry(const struct strlist *slist, unsigned int idx) 173 179 { 174 - struct rb_node *nd; 180 + struct str_node *snode = NULL; 181 + struct rb_node *rb_node; 175 182 176 - for (nd = rb_first(&self->entries); nd; nd = rb_next(nd)) { 177 - struct str_node *pos = rb_entry(nd, struct str_node, rb_node); 183 + rb_node = rblist__entry(&slist->rblist, idx); 184 + if (rb_node) 185 + snode = container_of(rb_node, struct str_node, rb_node); 178 186 179 - if (!idx--) 180 - return pos; 181 - } 182 - 183 - return NULL; 187 + return snode; 184 188 }
+6 -5
tools/perf/util/strlist.h
··· 4 4 #include <linux/rbtree.h> 5 5 #include <stdbool.h> 6 6 7 + #include "rblist.h" 8 + 7 9 struct str_node { 8 10 struct rb_node rb_node; 9 11 const char *s; 10 12 }; 11 13 12 14 struct strlist { 13 - struct rb_root entries; 14 - unsigned int nr_entries; 15 + struct rblist rblist; 15 16 bool dupstr; 16 17 }; 17 18 ··· 33 32 34 33 static inline bool strlist__empty(const struct strlist *self) 35 34 { 36 - return self->nr_entries == 0; 35 + return rblist__empty(&self->rblist); 37 36 } 38 37 39 38 static inline unsigned int strlist__nr_entries(const struct strlist *self) 40 39 { 41 - return self->nr_entries; 40 + return rblist__nr_entries(&self->rblist); 42 41 } 43 42 44 43 /* For strlist iteration */ 45 44 static inline struct str_node *strlist__first(struct strlist *self) 46 45 { 47 - struct rb_node *rn = rb_first(&self->entries); 46 + struct rb_node *rn = rb_first(&self->rblist.entries); 48 47 return rn ? rb_entry(rn, struct str_node, rb_node) : NULL; 49 48 } 50 49 static inline struct str_node *strlist__next(struct str_node *sn)