Implement differential reading of PMU counter
This avoids incorrect readings when resetting the counter
at a high frequency via ioctl.
diff --git a/vendor/arm/pmu/pmu_profiler.cpp b/vendor/arm/pmu/pmu_profiler.cpp
index 0ab13f0..76a0fc8 100644
--- a/vendor/arm/pmu/pmu_profiler.cpp
+++ b/vendor/arm/pmu/pmu_profiler.cpp
@@ -93,8 +93,12 @@
try
{
- measurements_[pmu_counter->first] = pmu_counter->second.get_value<long long>();
- pmu_counter->second.reset();
+ auto value = pmu_counter->second.get_value<long long>();
+
+ // Resetting the PMU counter every frame seems to alter the data,
+ // so we make a differential reading.
+ measurements_[pmu_counter->first] = value - prev_measurements_[pmu_counter->first].get<long long>();
+ prev_measurements_[pmu_counter->first] = value;
}
catch (const std::runtime_error &e)
{