#pragma once #include #include namespace NUnifiedAgent { class TThrottler { public: explicit TThrottler(double rate, TDuration updatePeriod = TDuration::MilliSeconds(100)); TThrottler(double rate, double burst); void Consume(double& tokens, TFMaybe& nextCheckDelay); bool TryConsume(double tokens); void ConsumeAndWait(double tokens); private: ui64 UpdateTokens(); private: ui64 CyclesPerMillisecond; ui64 UpdatePeriod; double PeriodTokens; double AvailableTokens; ui64 ExpirationTime; }; }