You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
sems/apps/sbc/RateLimit.h

62 lines
1.3 KiB

#ifndef _RateLimit_h_
#define _RateLimit_h_
#include "AmThread.h"
#include "atomic_types.h"
#include <sys/types.h>
class DynRateLimit
: protected AmMutex
{
u_int32_t last_update;
int counter;
unsigned int time_base;
void update_limit(int rate, int peak);
public:
// time_base_ms: milliseconds
DynRateLimit(unsigned int time_base_ms);
virtual ~DynRateLimit() {}
unsigned int getTimeBase() const { return time_base; }
/**
* rate: units/time_base
* peak: units/time_base
* returns true if 'size' should be dropped
*/
bool limit(unsigned int rate, unsigned int peak, unsigned int size);
/** Get last update timestamp (wheeltimer::wallclock ticks) */
u_int32_t getLastUpdate() { return last_update; }
};
class RateLimit
: protected DynRateLimit
{
int rate;
int peak;
public:
// time_base_ms: milliseconds
RateLimit(unsigned int rate, unsigned int peak, unsigned int time_base_ms)
: DynRateLimit(time_base_ms), rate(rate), peak(peak)
{}
int getRate() const { return rate; }
int getPeak() const { return peak; }
unsigned int getTimeBase() const { return DynRateLimit::getTimeBase(); }
/**
* returns true if 'size' should be dropped
*/
bool limit(unsigned int size) {
return DynRateLimit::limit(rate,peak,size);
}
};
#endif