25 lines
915 B
C++
25 lines
915 B
C++
#pragma once
|
|
|
|
#include <atomic>
|
|
|
|
namespace fluidsim::port {
|
|
|
|
class ThreadLoadTracker {
|
|
public:
|
|
void record(double busy_milliseconds, double budget_milliseconds) {
|
|
if (budget_milliseconds <= 0.0) return;
|
|
constexpr double alpha = 0.05;
|
|
const double instant = busy_milliseconds / budget_milliseconds * 100.0;
|
|
const double previous = load_percent_.load(std::memory_order_relaxed);
|
|
load_percent_.store(previous + alpha * (instant - previous), std::memory_order_relaxed);
|
|
last_busy_ms_.store(busy_milliseconds, std::memory_order_relaxed);
|
|
}
|
|
double load_percent() const { return load_percent_.load(std::memory_order_relaxed); }
|
|
double last_step_microseconds() const { return last_busy_ms_.load(std::memory_order_relaxed) * 1000.0; }
|
|
private:
|
|
std::atomic<double> load_percent_{};
|
|
std::atomic<double> last_busy_ms_{};
|
|
};
|
|
|
|
} // namespace fluidsim::port
|