1e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#ifndef __PERF_THREAD_H
2e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#define __PERF_THREAD_H
3e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
4e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <linux/rbtree.h>
5e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <unistd.h>
6e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include <sys/types.h>
7e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#include "symbol.h"
8e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
9e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct thread {
10e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	union {
11e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct rb_node	 rb_node;
12e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng		struct list_head node;
13e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	};
14e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	struct map_groups	mg;
15e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pid_t			pid_; /* Not all tools update this */
16e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pid_t			tid;
17e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	pid_t			ppid;
18e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			shortname[3];
19e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bool			comm_set;
20e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	bool			dead; /* if set thread has exited */
21e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	char			*comm;
22e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	int			comm_len;
23e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
24e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	void			*priv;
25e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng};
26e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
27e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct machine;
28e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
29e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstruct thread *thread__new(pid_t pid, pid_t tid);
30e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid thread__delete(struct thread *self);
31e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void thread__exited(struct thread *thread)
32e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
33e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	thread->dead = true;
34e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
35e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
36e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint thread__set_comm(struct thread *self, const char *comm);
37e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint thread__comm_len(struct thread *self);
38e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid thread__insert_map(struct thread *self, struct map *map);
39e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengint thread__fork(struct thread *self, struct thread *parent);
40e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengsize_t thread__fprintf(struct thread *thread, FILE *fp);
41e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
42e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline struct map *thread__find_map(struct thread *self,
43e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng					   enum map_type type, u64 addr)
44e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
45e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return self ? map_groups__find(&self->mg, type, addr) : NULL;
46e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
47e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
48e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid thread__find_addr_map(struct thread *thread, struct machine *machine,
49e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			   u8 cpumode, enum map_type type, u64 addr,
50e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng			   struct addr_location *al);
51e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
52e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengvoid thread__find_addr_location(struct thread *thread, struct machine *machine,
53e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				u8 cpumode, enum map_type type, u64 addr,
54e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng				struct addr_location *al);
55e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
56e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void *thread__priv(struct thread *thread)
57e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
58e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	return thread->priv;
59e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
60e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng
61e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Chengstatic inline void thread__set_priv(struct thread *thread, void *p)
62e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng{
63e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng	thread->priv = p;
64e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng}
65e6e8a0bd7cffcc9ae2e0e75546fb12a19213d4aeBen Cheng#endif	/* __PERF_THREAD_H */
66