diff options
Diffstat (limited to 'tools/perf/util/comm.c')
-rw-r--r-- | tools/perf/util/comm.c | 121 |
1 files changed, 0 insertions, 121 deletions
diff --git a/tools/perf/util/comm.c b/tools/perf/util/comm.c deleted file mode 100644 index ee0df0e..0000000 --- a/tools/perf/util/comm.c +++ /dev/null @@ -1,121 +0,0 @@ -#include "comm.h" -#include "util.h" -#include <stdlib.h> -#include <stdio.h> - -struct comm_str { - char *str; - struct rb_node rb_node; - int ref; -}; - -/* Should perhaps be moved to struct machine */ -static struct rb_root comm_str_root; - -static void comm_str__get(struct comm_str *cs) -{ - cs->ref++; -} - -static void comm_str__put(struct comm_str *cs) -{ - if (!--cs->ref) { - rb_erase(&cs->rb_node, &comm_str_root); - free(cs->str); - free(cs); - } -} - -static struct comm_str *comm_str__alloc(const char *str) -{ - struct comm_str *cs; - - cs = zalloc(sizeof(*cs)); - if (!cs) - return NULL; - - cs->str = strdup(str); - if (!cs->str) { - free(cs); - return NULL; - } - - return cs; -} - -static struct comm_str *comm_str__findnew(const char *str, struct rb_root *root) -{ - struct rb_node **p = &root->rb_node; - struct rb_node *parent = NULL; - struct comm_str *iter, *new; - int cmp; - - while (*p != NULL) { - parent = *p; - iter = rb_entry(parent, struct comm_str, rb_node); - - cmp = strcmp(str, iter->str); - if (!cmp) - return iter; - - if (cmp < 0) - p = &(*p)->rb_left; - else - p = &(*p)->rb_right; - } - - new = comm_str__alloc(str); - if (!new) - return NULL; - - rb_link_node(&new->rb_node, parent, p); - rb_insert_color(&new->rb_node, root); - - return new; -} - -struct comm *comm__new(const char *str, u64 timestamp) -{ - struct comm *comm = zalloc(sizeof(*comm)); - - if (!comm) - return NULL; - - comm->start = timestamp; - - comm->comm_str = comm_str__findnew(str, &comm_str_root); - if (!comm->comm_str) { - free(comm); - return NULL; - } - - comm_str__get(comm->comm_str); - - return comm; -} - -void comm__override(struct comm *comm, const char *str, u64 timestamp) -{ - struct comm_str *old = comm->comm_str; - - comm->comm_str = comm_str__findnew(str, &comm_str_root); - if (!comm->comm_str) { - comm->comm_str = old; - return; - } - - comm->start = timestamp; - comm_str__get(comm->comm_str); - comm_str__put(old); -} - -void comm__free(struct comm *comm) -{ - comm_str__put(comm->comm_str); - free(comm); -} - -const char *comm__str(const struct comm *comm) -{ - return comm->comm_str->str; -} |