#pragma once #include 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 load_percent_{}; std::atomic last_busy_ms_{}; }; } // namespace fluidsim::port