1/* 2 * Copyright 2012 The WebRTC Project Authors. All rights reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#ifndef WEBRTC_BASE_RATELIMITER_H_ 12#define WEBRTC_BASE_RATELIMITER_H_ 13 14#include <stdlib.h> 15#include "webrtc/base/basictypes.h" 16 17namespace rtc { 18 19// Limits the rate of use to a certain maximum quantity per period of 20// time. Use, for example, for simple bandwidth throttling. 21// 22// It's implemented like a diet plan: You have so many calories per 23// day. If you hit the limit, you can't eat any more until the next 24// day. 25class RateLimiter { 26 public: 27 // For example, 100kb per second. 28 RateLimiter(size_t max, double period) 29 : max_per_period_(max), 30 period_length_(period), 31 used_in_period_(0), 32 period_start_(0.0), 33 period_end_(period) { 34 } 35 virtual ~RateLimiter() {} 36 37 // Returns true if if the desired quantity is available in the 38 // current period (< (max - used)). Once the given time passes the 39 // end of the period, used is set to zero and more use is available. 40 bool CanUse(size_t desired, double time); 41 // Increment the quantity used this period. If past the end of a 42 // period, a new period is started. 43 void Use(size_t used, double time); 44 45 size_t used_in_period() const { 46 return used_in_period_; 47 } 48 49 size_t max_per_period() const { 50 return max_per_period_; 51 } 52 53 private: 54 size_t max_per_period_; 55 double period_length_; 56 size_t used_in_period_; 57 double period_start_; 58 double period_end_; 59}; 60 61} // namespace rtc 62 63#endif // WEBRTC_BASE_RATELIMITER_H_ 64