1 | // SPDX-License-Identifier: GPL-2.0 |
---|---|
2 | #include <errno.h> |
3 | #include <stdlib.h> |
4 | #include <string.h> |
5 | #include "evsel.h" |
6 | #include "counts.h" |
7 | #include <perf/threadmap.h> |
8 | #include <linux/zalloc.h> |
9 | |
10 | struct perf_counts *perf_counts__new(int ncpus, int nthreads) |
11 | { |
12 | struct perf_counts *counts = zalloc(sizeof(*counts)); |
13 | |
14 | if (counts) { |
15 | struct xyarray *values; |
16 | |
17 | values = xyarray__new(ncpus, nthreads, sizeof(struct perf_counts_values)); |
18 | if (!values) { |
19 | free(counts); |
20 | return NULL; |
21 | } |
22 | |
23 | counts->values = values; |
24 | |
25 | values = xyarray__new(ncpus, nthreads, sizeof(bool)); |
26 | if (!values) { |
27 | xyarray__delete(counts->values); |
28 | free(counts); |
29 | return NULL; |
30 | } |
31 | |
32 | counts->loaded = values; |
33 | } |
34 | |
35 | return counts; |
36 | } |
37 | |
38 | void perf_counts__delete(struct perf_counts *counts) |
39 | { |
40 | if (counts) { |
41 | xyarray__delete(counts->loaded); |
42 | xyarray__delete(counts->values); |
43 | free(counts); |
44 | } |
45 | } |
46 | |
47 | void perf_counts__reset(struct perf_counts *counts) |
48 | { |
49 | xyarray__reset(counts->loaded); |
50 | xyarray__reset(counts->values); |
51 | } |
52 | |
53 | void evsel__reset_counts(struct evsel *evsel) |
54 | { |
55 | perf_counts__reset(counts: evsel->counts); |
56 | } |
57 | |
58 | int evsel__alloc_counts(struct evsel *evsel) |
59 | { |
60 | struct perf_cpu_map *cpus = evsel__cpus(evsel); |
61 | int nthreads = perf_thread_map__nr(evsel->core.threads); |
62 | |
63 | evsel->counts = perf_counts__new(ncpus: perf_cpu_map__nr(cpus), nthreads); |
64 | return evsel->counts != NULL ? 0 : -ENOMEM; |
65 | } |
66 | |
67 | void evsel__free_counts(struct evsel *evsel) |
68 | { |
69 | perf_counts__delete(counts: evsel->counts); |
70 | evsel->counts = NULL; |
71 | } |
72 |