linux/tools/perf/util/thread.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef __PERF_THREAD_H
   3#define __PERF_THREAD_H
   4
   5#include <linux/refcount.h>
   6#include <linux/rbtree.h>
   7#include <linux/list.h>
   8#include <unistd.h>
   9#include <sys/types.h>
  10#include "symbol.h"
  11#include <strlist.h>
  12#include <intlist.h>
  13
  14struct thread_stack;
  15struct unwind_libunwind_ops;
  16
  17struct thread {
  18        union {
  19                struct rb_node   rb_node;
  20                struct list_head node;
  21        };
  22        struct map_groups       *mg;
  23        pid_t                   pid_; /* Not all tools update this */
  24        pid_t                   tid;
  25        pid_t                   ppid;
  26        int                     cpu;
  27        refcount_t              refcnt;
  28        char                    shortname[3];
  29        bool                    comm_set;
  30        int                     comm_len;
  31        bool                    dead; /* if set thread has exited */
  32        struct list_head        namespaces_list;
  33        struct list_head        comm_list;
  34        u64                     db_id;
  35
  36        void                    *priv;
  37        struct thread_stack     *ts;
  38        struct nsinfo           *nsinfo;
  39#ifdef HAVE_LIBUNWIND_SUPPORT
  40        void                            *addr_space;
  41        struct unwind_libunwind_ops     *unwind_libunwind_ops;
  42#endif
  43};
  44
  45struct machine;
  46struct namespaces;
  47struct comm;
  48
  49struct thread *thread__new(pid_t pid, pid_t tid);
  50int thread__init_map_groups(struct thread *thread, struct machine *machine);
  51void thread__delete(struct thread *thread);
  52
  53struct thread *thread__get(struct thread *thread);
  54void thread__put(struct thread *thread);
  55
  56static inline void __thread__zput(struct thread **thread)
  57{
  58        thread__put(*thread);
  59        *thread = NULL;
  60}
  61
  62#define thread__zput(thread) __thread__zput(&thread)
  63
  64static inline void thread__exited(struct thread *thread)
  65{
  66        thread->dead = true;
  67}
  68
  69struct namespaces *thread__namespaces(const struct thread *thread);
  70int thread__set_namespaces(struct thread *thread, u64 timestamp,
  71                           struct namespaces_event *event);
  72
  73int __thread__set_comm(struct thread *thread, const char *comm, u64 timestamp,
  74                       bool exec);
  75static inline int thread__set_comm(struct thread *thread, const char *comm,
  76                                   u64 timestamp)
  77{
  78        return __thread__set_comm(thread, comm, timestamp, false);
  79}
  80
  81int thread__set_comm_from_proc(struct thread *thread);
  82
  83int thread__comm_len(struct thread *thread);
  84struct comm *thread__comm(const struct thread *thread);
  85struct comm *thread__exec_comm(const struct thread *thread);
  86const char *thread__comm_str(const struct thread *thread);
  87int thread__insert_map(struct thread *thread, struct map *map);
  88int thread__fork(struct thread *thread, struct thread *parent, u64 timestamp);
  89size_t thread__fprintf(struct thread *thread, FILE *fp);
  90
  91struct thread *thread__main_thread(struct machine *machine, struct thread *thread);
  92
  93void thread__find_addr_map(struct thread *thread,
  94                           u8 cpumode, enum map_type type, u64 addr,
  95                           struct addr_location *al);
  96
  97void thread__find_addr_location(struct thread *thread,
  98                                u8 cpumode, enum map_type type, u64 addr,
  99                                struct addr_location *al);
 100
 101void thread__find_cpumode_addr_location(struct thread *thread,
 102                                        enum map_type type, u64 addr,
 103                                        struct addr_location *al);
 104
 105static inline void *thread__priv(struct thread *thread)
 106{
 107        return thread->priv;
 108}
 109
 110static inline void thread__set_priv(struct thread *thread, void *p)
 111{
 112        thread->priv = p;
 113}
 114
 115static inline bool thread__is_filtered(struct thread *thread)
 116{
 117        if (symbol_conf.comm_list &&
 118            !strlist__has_entry(symbol_conf.comm_list, thread__comm_str(thread))) {
 119                return true;
 120        }
 121
 122        if (symbol_conf.pid_list &&
 123            !intlist__has_entry(symbol_conf.pid_list, thread->pid_)) {
 124                return true;
 125        }
 126
 127        if (symbol_conf.tid_list &&
 128            !intlist__has_entry(symbol_conf.tid_list, thread->tid)) {
 129                return true;
 130        }
 131
 132        return false;
 133}
 134
 135#endif  /* __PERF_THREAD_H */
 136