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 static 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
);
70 /* Override latest entry if it had no specific time coverage */
72 list_del(&curr
->list
);
76 new = comm__new(str
, timestamp
);
80 list_add(&new->list
, &thread
->comm_list
);
81 thread
->comm_set
= true;
86 const char *thread__comm_str(const struct thread
*thread
)
88 const struct comm
*comm
= thread__comm(thread
);
93 return comm__str(comm
);
96 /* CHECKME: it should probably better return the max comm len from its comm list */
97 int thread__comm_len(struct thread
*thread
)
99 if (!thread
->comm_len
) {
100 const char *comm
= thread__comm_str(thread
);
103 thread
->comm_len
= strlen(comm
);
106 return thread
->comm_len
;
109 size_t thread__fprintf(struct thread
*thread
, FILE *fp
)
111 return fprintf(fp
, "Thread %d %s\n", thread
->tid
, thread__comm_str(thread
)) +
112 map_groups__fprintf(&thread
->mg
, verbose
, fp
);
115 void thread__insert_map(struct thread
*thread
, struct map
*map
)
117 map_groups__fixup_overlappings(&thread
->mg
, map
, verbose
, stderr
);
118 map_groups__insert(&thread
->mg
, map
);
121 int thread__fork(struct thread
*thread
, struct thread
*parent
, u64 timestamp
)
125 if (parent
->comm_set
) {
126 const char *comm
= thread__comm_str(parent
);
129 err
= thread__set_comm(thread
, comm
, timestamp
);
132 thread
->comm_set
= true;
135 for (i
= 0; i
< MAP__NR_TYPES
; ++i
)
136 if (map_groups__clone(&thread
->mg
, &parent
->mg
, i
) < 0)
139 thread
->ppid
= parent
->tid
;
This page took 0.042783 seconds and 5 git commands to generate.