|
@@ -1,6 +1,8 @@
|
|
|
#include <math.h>
|
|
|
#include "stat.h"
|
|
|
+#include "evlist.h"
|
|
|
#include "evsel.h"
|
|
|
+#include "thread_map.h"
|
|
|
|
|
|
void update_stats(struct stats *stats, u64 val)
|
|
|
{
|
|
@@ -186,3 +188,45 @@ void perf_evsel__free_prev_raw_counts(struct perf_evsel *evsel)
|
|
|
perf_counts__delete(evsel->prev_raw_counts);
|
|
|
evsel->prev_raw_counts = NULL;
|
|
|
}
|
|
|
+
|
|
|
+int perf_evlist__alloc_stats(struct perf_evlist *evlist, bool alloc_raw)
|
|
|
+{
|
|
|
+ struct perf_evsel *evsel;
|
|
|
+ int nthreads = thread_map__nr(evlist->threads);
|
|
|
+
|
|
|
+ evlist__for_each(evlist, evsel) {
|
|
|
+ int ncpus = perf_evsel__nr_cpus(evsel);
|
|
|
+
|
|
|
+ if (perf_evsel__alloc_stat_priv(evsel) < 0 ||
|
|
|
+ perf_evsel__alloc_counts(evsel, ncpus, nthreads) < 0 ||
|
|
|
+ (alloc_raw && perf_evsel__alloc_prev_raw_counts(evsel, ncpus, nthreads) < 0))
|
|
|
+ goto out_free;
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+
|
|
|
+out_free:
|
|
|
+ perf_evlist__free_stats(evlist);
|
|
|
+ return -1;
|
|
|
+}
|
|
|
+
|
|
|
+void perf_evlist__free_stats(struct perf_evlist *evlist)
|
|
|
+{
|
|
|
+ struct perf_evsel *evsel;
|
|
|
+
|
|
|
+ evlist__for_each(evlist, evsel) {
|
|
|
+ perf_evsel__free_stat_priv(evsel);
|
|
|
+ perf_evsel__free_counts(evsel);
|
|
|
+ perf_evsel__free_prev_raw_counts(evsel);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+void perf_evlist__reset_stats(struct perf_evlist *evlist)
|
|
|
+{
|
|
|
+ struct perf_evsel *evsel;
|
|
|
+
|
|
|
+ evlist__for_each(evlist, evsel) {
|
|
|
+ perf_evsel__reset_stat_priv(evsel);
|
|
|
+ perf_evsel__reset_counts(evsel);
|
|
|
+ }
|
|
|
+}
|