11 struct thread
*thread__new(pid_t pid
, pid_t tid
)
15 struct thread
*thread
= zalloc(sizeof(*thread
));
18 map_groups__init(&thread
->mg
);
22 INIT_LIST_HEAD(&thread
->comm_list
);
24 comm_str
= malloc(32);
28 snprintf(comm_str
, 32, ":%d", tid
);
29 comm
= comm__new(comm_str
, 0);
34 list_add(&comm
->list
, &thread
->comm_list
);
44 void thread__delete(struct thread
*thread
)
46 struct comm
*comm
, *tmp
;
48 map_groups__exit(&thread
->mg
);
49 list_for_each_entry_safe(comm
, tmp
, &thread
->comm_list
, list
) {
50 list_del(&comm
->list
);
57 struct comm
*thread__comm(const struct thread
*thread
)
59 if (list_empty(&thread
->comm_list
))
62 return list_first_entry(&thread
->comm_list
, struct comm
, list
);
65 /* CHECKME: time should always be 0 if event aren't ordered */
66 int thread__set_comm(struct thread
*thread
, const char *str
, u64 timestamp
)
68 struct comm
*new, *curr
= thread__comm(thread
);
71 /* Override latest entry if it had no specific time coverage */
73 err
= comm__override(curr
, str
, timestamp
);
77 new = comm__new(str
, timestamp
);
80 list_add(&new->list
, &thread
->comm_list
);
83 thread
->comm_set
= true;
88 const char *thread__comm_str(const struct thread
*thread
)
90 const struct comm
*comm
= thread__comm(thread
);
95 return comm__str(comm
);
98 /* CHECKME: it should probably better return the max comm len from its comm list */
99 int thread__comm_len(struct thread
*thread
)
101 if (!thread
->comm_len
) {
102 const char *comm
= thread__comm_str(thread
);
105 thread
->comm_len
= strlen(comm
);
108 return thread
->comm_len
;
111 size_t thread__fprintf(struct thread
*thread
, FILE *fp
)
113 return fprintf(fp
, "Thread %d %s\n", thread
->tid
, thread__comm_str(thread
)) +
114 map_groups__fprintf(&thread
->mg
, verbose
, fp
);
117 void thread__insert_map(struct thread
*thread
, struct map
*map
)
119 map_groups__fixup_overlappings(&thread
->mg
, map
, verbose
, stderr
);
120 map_groups__insert(&thread
->mg
, map
);
123 int thread__fork(struct thread
*thread
, struct thread
*parent
, u64 timestamp
)
127 if (parent
->comm_set
) {
128 const char *comm
= thread__comm_str(parent
);
131 err
= thread__set_comm(thread
, comm
, timestamp
);
134 thread
->comm_set
= true;
137 for (i
= 0; i
< MAP__NR_TYPES
; ++i
)
138 if (map_groups__clone(&thread
->mg
, &parent
->mg
, i
) < 0)
141 thread
->ppid
= parent
->tid
;