diff options
Diffstat (limited to 'tools/perf/util/evsel.h')
-rw-r--r-- | tools/perf/util/evsel.h | 50 |
1 files changed, 48 insertions, 2 deletions
diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 3d2b8017438c..52021c3087df 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h | |||
@@ -53,6 +53,7 @@ struct perf_evsel { | |||
53 | struct xyarray *sample_id; | 53 | struct xyarray *sample_id; |
54 | u64 *id; | 54 | u64 *id; |
55 | struct perf_counts *counts; | 55 | struct perf_counts *counts; |
56 | struct perf_counts *prev_raw_counts; | ||
56 | int idx; | 57 | int idx; |
57 | u32 ids; | 58 | u32 ids; |
58 | struct hists hists; | 59 | struct hists hists; |
@@ -73,10 +74,13 @@ struct perf_evsel { | |||
73 | bool needs_swap; | 74 | bool needs_swap; |
74 | /* parse modifier helper */ | 75 | /* parse modifier helper */ |
75 | int exclude_GH; | 76 | int exclude_GH; |
77 | int nr_members; | ||
76 | struct perf_evsel *leader; | 78 | struct perf_evsel *leader; |
77 | char *group_name; | 79 | char *group_name; |
78 | }; | 80 | }; |
79 | 81 | ||
82 | #define hists_to_evsel(h) container_of(h, struct perf_evsel, hists) | ||
83 | |||
80 | struct cpu_map; | 84 | struct cpu_map; |
81 | struct thread_map; | 85 | struct thread_map; |
82 | struct perf_evlist; | 86 | struct perf_evlist; |
@@ -110,14 +114,30 @@ extern const char *perf_evsel__sw_names[PERF_COUNT_SW_MAX]; | |||
110 | int __perf_evsel__hw_cache_type_op_res_name(u8 type, u8 op, u8 result, | 114 | int __perf_evsel__hw_cache_type_op_res_name(u8 type, u8 op, u8 result, |
111 | char *bf, size_t size); | 115 | char *bf, size_t size); |
112 | const char *perf_evsel__name(struct perf_evsel *evsel); | 116 | const char *perf_evsel__name(struct perf_evsel *evsel); |
117 | const char *perf_evsel__group_name(struct perf_evsel *evsel); | ||
118 | int perf_evsel__group_desc(struct perf_evsel *evsel, char *buf, size_t size); | ||
113 | 119 | ||
114 | int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads); | 120 | int perf_evsel__alloc_fd(struct perf_evsel *evsel, int ncpus, int nthreads); |
115 | int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads); | 121 | int perf_evsel__alloc_id(struct perf_evsel *evsel, int ncpus, int nthreads); |
116 | int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus); | 122 | int perf_evsel__alloc_counts(struct perf_evsel *evsel, int ncpus); |
117 | void perf_evsel__free_fd(struct perf_evsel *evsel); | 123 | void perf_evsel__free_fd(struct perf_evsel *evsel); |
118 | void perf_evsel__free_id(struct perf_evsel *evsel); | 124 | void perf_evsel__free_id(struct perf_evsel *evsel); |
125 | void perf_evsel__free_counts(struct perf_evsel *evsel); | ||
119 | void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads); | 126 | void perf_evsel__close_fd(struct perf_evsel *evsel, int ncpus, int nthreads); |
120 | 127 | ||
128 | void __perf_evsel__set_sample_bit(struct perf_evsel *evsel, | ||
129 | enum perf_event_sample_format bit); | ||
130 | void __perf_evsel__reset_sample_bit(struct perf_evsel *evsel, | ||
131 | enum perf_event_sample_format bit); | ||
132 | |||
133 | #define perf_evsel__set_sample_bit(evsel, bit) \ | ||
134 | __perf_evsel__set_sample_bit(evsel, PERF_SAMPLE_##bit) | ||
135 | |||
136 | #define perf_evsel__reset_sample_bit(evsel, bit) \ | ||
137 | __perf_evsel__reset_sample_bit(evsel, PERF_SAMPLE_##bit) | ||
138 | |||
139 | void perf_evsel__set_sample_id(struct perf_evsel *evsel); | ||
140 | |||
121 | int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads, | 141 | int perf_evsel__set_filter(struct perf_evsel *evsel, int ncpus, int nthreads, |
122 | const char *filter); | 142 | const char *filter); |
123 | 143 | ||
@@ -226,8 +246,34 @@ static inline struct perf_evsel *perf_evsel__next(struct perf_evsel *evsel) | |||
226 | return list_entry(evsel->node.next, struct perf_evsel, node); | 246 | return list_entry(evsel->node.next, struct perf_evsel, node); |
227 | } | 247 | } |
228 | 248 | ||
229 | static inline bool perf_evsel__is_group_member(const struct perf_evsel *evsel) | 249 | static inline bool perf_evsel__is_group_leader(const struct perf_evsel *evsel) |
250 | { | ||
251 | return evsel->leader == evsel; | ||
252 | } | ||
253 | |||
254 | struct perf_attr_details { | ||
255 | bool freq; | ||
256 | bool verbose; | ||
257 | bool event_group; | ||
258 | }; | ||
259 | |||
260 | int perf_evsel__fprintf(struct perf_evsel *evsel, | ||
261 | struct perf_attr_details *details, FILE *fp); | ||
262 | |||
263 | bool perf_evsel__fallback(struct perf_evsel *evsel, int err, | ||
264 | char *msg, size_t msgsize); | ||
265 | int perf_evsel__open_strerror(struct perf_evsel *evsel, | ||
266 | struct perf_target *target, | ||
267 | int err, char *msg, size_t size); | ||
268 | |||
269 | static inline int perf_evsel__group_idx(struct perf_evsel *evsel) | ||
230 | { | 270 | { |
231 | return evsel->leader != NULL; | 271 | return evsel->idx - evsel->leader->idx; |
232 | } | 272 | } |
273 | |||
274 | #define for_each_group_member(_evsel, _leader) \ | ||
275 | for ((_evsel) = list_entry((_leader)->node.next, struct perf_evsel, node); \ | ||
276 | (_evsel) && (_evsel)->leader == (_leader); \ | ||
277 | (_evsel) = list_entry((_evsel)->node.next, struct perf_evsel, node)) | ||
278 | |||
233 | #endif /* __PERF_EVSEL_H */ | 279 | #endif /* __PERF_EVSEL_H */ |