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
, bool exec
)
79 struct comm
*comm
= zalloc(sizeof(*comm
));
84 comm
->start
= timestamp
;
87 comm
->comm_str
= comm_str__findnew(str
, &comm_str_root
);
88 if (!comm
->comm_str
) {
93 comm_str__get(comm
->comm_str
);
98 int comm__override(struct comm
*comm
, const char *str
, u64 timestamp
, bool exec
)
100 struct comm_str
*new, *old
= comm
->comm_str
;
102 new = comm_str__findnew(str
, &comm_str_root
);
108 comm
->comm_str
= new;
109 comm
->start
= timestamp
;
116 void comm__free(struct comm
*comm
)
118 comm_str__put(comm
->comm_str
);
122 const char *comm__str(const struct comm
*comm
)
124 return comm
->comm_str
->str
;