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