summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libs/ardour/ardour/dsp_load_calculator.h2
-rw-r--r--libs/ardour/dsp_load_calculator.cc13
2 files changed, 15 insertions, 0 deletions
diff --git a/libs/ardour/ardour/dsp_load_calculator.h b/libs/ardour/ardour/dsp_load_calculator.h
index 6e1ac25cb0..f3c5fea227 100644
--- a/libs/ardour/ardour/dsp_load_calculator.h
+++ b/libs/ardour/ardour/dsp_load_calculator.h
@@ -88,6 +88,8 @@ public:
private: // methods
static uint32_t max_value_history () { return 16; }
+ int64_t max_timer_error () { return 4 * m_max_time_us; }
+
private: // data
int64_t m_max_time_us;
int64_t m_start_timestamp_us;
diff --git a/libs/ardour/dsp_load_calculator.cc b/libs/ardour/dsp_load_calculator.cc
index 99147c6a14..6b8e2b70e7 100644
--- a/libs/ardour/dsp_load_calculator.cc
+++ b/libs/ardour/dsp_load_calculator.cc
@@ -28,6 +28,19 @@ DSPLoadCalculator::set_stop_timestamp_us(int64_t stop_timestamp_us)
// which would mean consistent overhead for small values of m_max_time_us
m_stop_timestamp_us = stop_timestamp_us;
+
+ /* querying the performance counter can fail occasionally (-1).
+ * Also on some multi-core systems, timers are CPU specific and not
+ * synchronized. We assume they differ more than a few milliseconds
+ * (4 * nominal cycle time) and simply ignore cases where the
+ * execution switches cores.
+ */
+ if (m_start_timestamp_us < 0 || m_stop_timestamp_us < 0 ||
+ m_start_timestamp_us > m_stop_timestamp_us ||
+ elapsed_time_us() > max_timer_error()) {
+ return;
+ }
+
float load = 0;
if (elapsed_time_us() > m_max_time_us) {