1#ifndef _PERF_TARGET_H
2#define _PERF_TARGET_H
3
4#include <stdbool.h>
5#include <sys/types.h>
6
7struct target {
8 const char *pid;
9 const char *tid;
10 const char *cpu_list;
11 const char *uid_str;
12 uid_t uid;
13 bool system_wide;
14 bool uses_mmap;
15 bool default_per_cpu;
16 bool per_thread;
17};
18
19enum target_errno {
20 TARGET_ERRNO__SUCCESS = 0,
21
22
23
24
25
26
27
28
29 __TARGET_ERRNO__START = -10000,
30
31
32 TARGET_ERRNO__PID_OVERRIDE_CPU = __TARGET_ERRNO__START,
33 TARGET_ERRNO__PID_OVERRIDE_UID,
34 TARGET_ERRNO__UID_OVERRIDE_CPU,
35 TARGET_ERRNO__PID_OVERRIDE_SYSTEM,
36 TARGET_ERRNO__UID_OVERRIDE_SYSTEM,
37 TARGET_ERRNO__SYSTEM_OVERRIDE_THREAD,
38
39
40 TARGET_ERRNO__INVALID_UID,
41 TARGET_ERRNO__USER_NOT_FOUND,
42
43 __TARGET_ERRNO__END,
44};
45
46enum target_errno target__validate(struct target *target);
47enum target_errno target__parse_uid(struct target *target);
48
49int target__strerror(struct target *target, int errnum, char *buf, size_t buflen);
50
51static inline bool target__has_task(struct target *target)
52{
53 return target->tid || target->pid || target->uid_str;
54}
55
56static inline bool target__has_cpu(struct target *target)
57{
58 return target->system_wide || target->cpu_list;
59}
60
61static inline bool target__none(struct target *target)
62{
63 return !target__has_task(target) && !target__has_cpu(target);
64}
65
66static inline bool target__has_per_thread(struct target *target)
67{
68 return target->system_wide && target->per_thread;
69}
70
71static inline bool target__uses_dummy_map(struct target *target)
72{
73 bool use_dummy = false;
74
75 if (target->default_per_cpu)
76 use_dummy = target->per_thread ? true : false;
77 else if (target__has_task(target) ||
78 (!target__has_cpu(target) && !target->uses_mmap))
79 use_dummy = true;
80 else if (target__has_per_thread(target))
81 use_dummy = true;
82
83 return use_dummy;
84}
85
86#endif
87