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