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 17 namespace 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. 25 class RateLimiter { 26 public: 27 // For example, 100kb per second. RateLimiter(size_t max,double period)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 } ~RateLimiter()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 used_in_period()45 size_t used_in_period() const { 46 return used_in_period_; 47 } 48 max_per_period()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