xref: /linux/tools/perf/util/counts.c (revision 8b76a318)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2a43783aeSArnaldo Carvalho de Melo #include <errno.h>
3d809560bSJiri Olsa #include <stdlib.h>
4cf4d9bd6SJin Yao #include <string.h>
5d809560bSJiri Olsa #include "evsel.h"
6d809560bSJiri Olsa #include "counts.h"
72ca0a371SIan Rogers #include <perf/threadmap.h>
87f7c536fSArnaldo Carvalho de Melo #include <linux/zalloc.h>
9d809560bSJiri Olsa 
perf_counts__new(int ncpus,int nthreads)10d809560bSJiri Olsa struct perf_counts *perf_counts__new(int ncpus, int nthreads)
11d809560bSJiri Olsa {
12d809560bSJiri Olsa 	struct perf_counts *counts = zalloc(sizeof(*counts));
13d809560bSJiri Olsa 
14d809560bSJiri Olsa 	if (counts) {
15d809560bSJiri Olsa 		struct xyarray *values;
16d809560bSJiri Olsa 
17d809560bSJiri Olsa 		values = xyarray__new(ncpus, nthreads, sizeof(struct perf_counts_values));
18d809560bSJiri Olsa 		if (!values) {
19d809560bSJiri Olsa 			free(counts);
20d809560bSJiri Olsa 			return NULL;
21d809560bSJiri Olsa 		}
22d809560bSJiri Olsa 
23d809560bSJiri Olsa 		counts->values = values;
24df1d6856SJiri Olsa 
25df1d6856SJiri Olsa 		values = xyarray__new(ncpus, nthreads, sizeof(bool));
26df1d6856SJiri Olsa 		if (!values) {
27df1d6856SJiri Olsa 			xyarray__delete(counts->values);
28df1d6856SJiri Olsa 			free(counts);
29df1d6856SJiri Olsa 			return NULL;
30df1d6856SJiri Olsa 		}
31df1d6856SJiri Olsa 
32df1d6856SJiri Olsa 		counts->loaded = values;
33d809560bSJiri Olsa 	}
34d809560bSJiri Olsa 
35d809560bSJiri Olsa 	return counts;
36d809560bSJiri Olsa }
37d809560bSJiri Olsa 
perf_counts__delete(struct perf_counts * counts)38d809560bSJiri Olsa void perf_counts__delete(struct perf_counts *counts)
39d809560bSJiri Olsa {
40d809560bSJiri Olsa 	if (counts) {
41df1d6856SJiri Olsa 		xyarray__delete(counts->loaded);
42d809560bSJiri Olsa 		xyarray__delete(counts->values);
43d809560bSJiri Olsa 		free(counts);
44d809560bSJiri Olsa 	}
45d809560bSJiri Olsa }
46d809560bSJiri Olsa 
perf_counts__reset(struct perf_counts * counts)47cf4d9bd6SJin Yao void perf_counts__reset(struct perf_counts *counts)
48d809560bSJiri Olsa {
49df1d6856SJiri Olsa 	xyarray__reset(counts->loaded);
50d809560bSJiri Olsa 	xyarray__reset(counts->values);
51d809560bSJiri Olsa }
52d809560bSJiri Olsa 
evsel__reset_counts(struct evsel * evsel)537d1e239eSArnaldo Carvalho de Melo void evsel__reset_counts(struct evsel *evsel)
54d809560bSJiri Olsa {
55d809560bSJiri Olsa 	perf_counts__reset(evsel->counts);
56d809560bSJiri Olsa }
57d809560bSJiri Olsa 
evsel__alloc_counts(struct evsel * evsel)582ca0a371SIan Rogers int evsel__alloc_counts(struct evsel *evsel)
59d809560bSJiri Olsa {
602ca0a371SIan Rogers 	struct perf_cpu_map *cpus = evsel__cpus(evsel);
612ca0a371SIan Rogers 	int nthreads = perf_thread_map__nr(evsel->core.threads);
622ca0a371SIan Rogers 
63*44028699SIan Rogers 	evsel->counts = perf_counts__new(perf_cpu_map__nr(cpus), nthreads);
64d809560bSJiri Olsa 	return evsel->counts != NULL ? 0 : -ENOMEM;
65d809560bSJiri Olsa }
66d809560bSJiri Olsa 
evsel__free_counts(struct evsel * evsel)677d1e239eSArnaldo Carvalho de Melo void evsel__free_counts(struct evsel *evsel)
68d809560bSJiri Olsa {
69d809560bSJiri Olsa 	perf_counts__delete(evsel->counts);
70d809560bSJiri Olsa 	evsel->counts = NULL;
71d809560bSJiri Olsa }
72