]>
git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/blob - tools/perf/util/thread.c
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
);
70 /* Override latest entry if it had no specific time coverage */
72 comm__override(curr
, str
, timestamp
);
74 new = comm__new(str
, timestamp
);
77 list_add(&new->list
, &thread
->comm_list
);
80 thread
->comm_set
= true;
85 const char *thread__comm_str(const struct thread
*thread
)
87 const struct comm
*comm
= thread__comm(thread
);
92 return comm__str(comm
);
95 /* CHECKME: it should probably better return the max comm len from its comm list */
96 int thread__comm_len(struct thread
*thread
)
98 if (!thread
->comm_len
) {
99 const char *comm
= thread__comm_str(thread
);
102 thread
->comm_len
= strlen(comm
);
105 return thread
->comm_len
;
108 size_t thread__fprintf(struct thread
*thread
, FILE *fp
)
110 return fprintf(fp
, "Thread %d %s\n", thread
->tid
, thread__comm_str(thread
)) +
111 map_groups__fprintf(&thread
->mg
, verbose
, fp
);
114 void thread__insert_map(struct thread
*thread
, struct map
*map
)
116 map_groups__fixup_overlappings(&thread
->mg
, map
, verbose
, stderr
);
117 map_groups__insert(&thread
->mg
, map
);
120 int thread__fork(struct thread
*thread
, struct thread
*parent
, u64 timestamp
)
124 if (parent
->comm_set
) {
125 const char *comm
= thread__comm_str(parent
);
128 err
= thread__set_comm(thread
, comm
, timestamp
);
131 thread
->comm_set
= true;
134 for (i
= 0; i
< MAP__NR_TYPES
; ++i
)
135 if (map_groups__clone(&thread
->mg
, &parent
->mg
, i
) < 0)
138 thread
->ppid
= parent
->tid
;