change PBD::microseconds_t to a signed type and check for -1 in TimingStats::update
This may help a Windows issue with the return value of QueryPerformanceCounter
This commit is contained in:
parent
45c8944789
commit
b20a541d7e
@ -198,7 +198,7 @@ public:
|
||||
bool load_preset (Plugin::PresetRecord);
|
||||
|
||||
bool provides_stats () const;
|
||||
bool get_stats (uint64_t& min, uint64_t& max, double& avg, double& dev) const;
|
||||
bool get_stats (PBD::microseconds_t& min, PBD::microseconds_t& max, double& avg, double& dev) const;
|
||||
void clear_stats ();
|
||||
|
||||
/** A control that manipulates a plugin parameter (control port). */
|
||||
|
@ -3383,7 +3383,7 @@ PluginInsert::provides_stats () const
|
||||
}
|
||||
|
||||
bool
|
||||
PluginInsert::get_stats (uint64_t& min, uint64_t& max, double& avg, double& dev) const
|
||||
PluginInsert::get_stats (PBD::microseconds_t& min, PBD::microseconds_t& max, double& avg, double& dev) const
|
||||
{
|
||||
/* TODO: consider taking a try/lock: Don't run concurrently with
|
||||
* TimingStats::update, TimingStats::reset.
|
||||
|
@ -26,7 +26,7 @@
|
||||
#include "pbd/libpbd_visibility.h"
|
||||
|
||||
namespace PBD {
|
||||
typedef uint64_t microseconds_t;
|
||||
typedef int64_t microseconds_t;
|
||||
LIBPBD_API microseconds_t get_microseconds();
|
||||
void microsecond_timer_init ();
|
||||
}
|
||||
|
@ -116,8 +116,7 @@ public:
|
||||
return elapsed () / 1000;
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
protected:
|
||||
microseconds_t m_start_val;
|
||||
microseconds_t m_last_val;
|
||||
|
||||
@ -138,17 +137,18 @@ public:
|
||||
reset ();
|
||||
} else {
|
||||
Timing::update ();
|
||||
calc ();
|
||||
}
|
||||
}
|
||||
|
||||
/* interval computed externally */
|
||||
void update (microseconds_t interval)
|
||||
{
|
||||
if (_queue_reset) {
|
||||
reset ();
|
||||
} else {
|
||||
Timing::update (interval);
|
||||
/* 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_val < 0 || m_last_val < 0 || m_start_val > m_last_val) {
|
||||
return;
|
||||
}
|
||||
|
||||
calc ();
|
||||
}
|
||||
}
|
||||
|
@ -26,17 +26,17 @@
|
||||
namespace PBD {
|
||||
|
||||
bool
|
||||
get_min_max_avg_total (const std::vector<uint64_t>& values, uint64_t& min, uint64_t& max, uint64_t& avg, uint64_t& total)
|
||||
get_min_max_avg_total (const std::vector<microseconds_t>& values, microseconds_t& min, microseconds_t& max, microseconds_t& avg, microseconds_t& total)
|
||||
{
|
||||
if (values.empty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
total = 0;
|
||||
min = std::numeric_limits<uint64_t>::max();
|
||||
min = std::numeric_limits<microseconds_t>::max();
|
||||
max = 0; avg = 0;
|
||||
|
||||
for (std::vector<uint64_t>::const_iterator ci = values.begin(); ci != values.end(); ++ci) {
|
||||
for (std::vector<microseconds_t>::const_iterator ci = values.begin(); ci != values.end(); ++ci) {
|
||||
total += *ci;
|
||||
min = std::min (min, *ci);
|
||||
max = std::max (max, *ci);
|
||||
@ -47,11 +47,11 @@ get_min_max_avg_total (const std::vector<uint64_t>& values, uint64_t& min, uint6
|
||||
}
|
||||
|
||||
std::string
|
||||
timing_summary (const std::vector<uint64_t>& values)
|
||||
timing_summary (const std::vector<microseconds_t>& values)
|
||||
{
|
||||
std::ostringstream oss;
|
||||
|
||||
uint64_t min, max, avg, total;
|
||||
microseconds_t min, max, avg, total;
|
||||
|
||||
if (get_min_max_avg_total (values, min, max, avg, total)) {
|
||||
oss << "Count: " << values.size()
|
||||
|
@ -951,7 +951,7 @@ Surface::zero_controls ()
|
||||
}
|
||||
|
||||
void
|
||||
Surface::periodic (uint64_t now_usecs)
|
||||
Surface::periodic (PBD::microseconds_t now_usecs)
|
||||
{
|
||||
master_gain_changed();
|
||||
for (Strips::iterator s = strips.begin(); s != strips.end(); ++s) {
|
||||
|
@ -909,7 +909,7 @@ Surface::zero_controls ()
|
||||
}
|
||||
|
||||
void
|
||||
Surface::periodic (uint64_t now_usecs)
|
||||
Surface::periodic (PBD::microseconds_t now_usecs)
|
||||
{
|
||||
if (_active) {
|
||||
master_gain_changed();
|
||||
|
Loading…
Reference in New Issue
Block a user