More updates to bandwidth accounting.

This commit is contained in:
Adam Ierymenko 2013-09-11 16:08:31 -04:00
parent 9cdaefdb9a
commit 5885c6186d
2 changed files with 37 additions and 20 deletions

View file

@ -66,7 +66,7 @@ public:
* @param maxb Maximum allowed balance (> 0)
* @param acc Rate of accrual in bytes per second
*/
BandwidthAccount(int32_t preload,int32_t maxb,int32_t acc)
BandwidthAccount(uint32_t preload,uint32_t maxb,uint32_t acc)
throw()
{
init(preload,maxb,acc);
@ -79,7 +79,7 @@ public:
* @param maxb Maximum allowed balance (> 0)
* @param acc Rate of accrual in bytes per second
*/
inline void init(int32_t preload,int32_t maxb,int32_t acc)
inline void init(uint32_t preload,uint32_t maxb,uint32_t acc)
throw()
{
_lastTime = Utils::nowf();
@ -89,27 +89,43 @@ public:
}
/**
* Update balance by accruing and then deducting
* Update and retrieve balance of this account
*
* @param deduct Amount to deduct, or 0.0 to just update
* @return New balance after deduction -- if negative, it didn't fit
* @return New balance updated from current clock
*/
inline int32_t update(int32_t deduct)
inline uint32_t update()
throw()
{
double lt = _lastTime;
double now = Utils::nowf();
_lastTime = now;
int32_t newbal = (int32_t)round((double)_balance + ((double)_accrual * (now - lt))) - deduct;
_balance = std::max((int32_t)0,std::min(_maxBalance,newbal));
return newbal;
return (_balance = std::min(_maxBalance,(uint32_t)round((double)_balance + ((double)_accrual * (now - lt)))));
}
/**
* Update balance and conditionally deduct
*
* If the deduction amount fits, it is deducted after update. Otherwise
* balance is updated and false is returned.
*
* @param amt Amount to deduct
* @return True if amount fit within balance and was deducted
*/
inline bool deduct(uint32_t amt)
throw()
{
if (update() >= amt) {
_balance -= amt;
return true;
}
return false;
}
private:
double _lastTime;
int32_t _balance;
int32_t _maxBalance;
int32_t _accrual;
uint32_t _balance;
uint32_t _maxBalance;
uint32_t _accrual;
};
} // namespace ZeroTier