8 struct rb_node rb_node
;
12 /* Should perhaps be moved to struct machine */
13 static struct rb_root comm_str_root
;
15 static void comm_str__get(struct comm_str
*cs
)
20 static void comm_str__put(struct comm_str
*cs
)
23 rb_erase(&cs
->rb_node
, &comm_str_root
);
29 static struct comm_str
*comm_str__alloc(const char *str
)
33 cs
= zalloc(sizeof(*cs
));
37 cs
->str
= strdup(str
);
46 static struct comm_str
*comm_str__findnew(const char *str
, struct rb_root
*root
)
48 struct rb_node
**p
= &root
->rb_node
;
49 struct rb_node
*parent
= NULL
;
50 struct comm_str
*iter
, *new;
55 iter
= rb_entry(parent
, struct comm_str
, rb_node
);
57 cmp
= strcmp(str
, iter
->str
);
67 new = comm_str__alloc(str
);
71 rb_link_node(&new->rb_node
, parent
, p
);
72 rb_insert_color(&new->rb_node
, root
);
77 struct comm
*comm__new(const char *str
, u64 timestamp
)
79 struct comm
*comm
= zalloc(sizeof(*comm
));
84 comm
->start
= timestamp
;
86 comm
->comm_str
= comm_str__findnew(str
, &comm_str_root
);
87 if (!comm
->comm_str
) {
92 comm_str__get(comm
->comm_str
);
97 int comm__override(struct comm
*comm
, const char *str
, u64 timestamp
)
99 struct comm_str
*new, *old
= comm
->comm_str
;
101 new = comm_str__findnew(str
, &comm_str_root
);
107 comm
->comm_str
= new;
108 comm
->start
= timestamp
;
113 void comm__free(struct comm
*comm
)
115 comm_str__put(comm
->comm_str
);
119 const char *comm__str(const struct comm
*comm
)
121 return comm
->comm_str
->str
;