blob: 24ed1add833967fc3c337d60eba35e730782b43e [file] [log] [blame]
henrike@webrtc.org47be73b2014-05-13 18:00:261/*
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
Henrik Kjellanderfb3e1b62017-06-29 06:03:0411#ifndef WEBRTC_RTC_BASE_RATELIMITER_H_
12#define WEBRTC_RTC_BASE_RATELIMITER_H_
henrike@webrtc.org47be73b2014-05-13 18:00:2613
Henrik Kjellander88b2dd42017-06-29 05:52:5014#include <stddef.h>
henrike@webrtc.org47be73b2014-05-13 18:00:2615
Henrik Kjellander88b2dd42017-06-29 05:52:5016namespace rtc {
17
18// Limits the rate of use to a certain maximum quantity per period of
19// time. Use, for example, for simple bandwidth throttling.
20//
21// It's implemented like a diet plan: You have so many calories per
22// day. If you hit the limit, you can't eat any more until the next
23// day.
24class RateLimiter {
25 public:
26 // For example, 100kb per second.
27 RateLimiter(size_t max, double period)
28 : max_per_period_(max),
29 period_length_(period),
30 used_in_period_(0),
31 period_start_(0.0),
32 period_end_(period) {
33 }
34 virtual ~RateLimiter() {}
35
36 // Returns true if if the desired quantity is available in the
37 // current period (< (max - used)). Once the given time passes the
38 // end of the period, used is set to zero and more use is available.
39 bool CanUse(size_t desired, double time);
40 // Increment the quantity used this period. If past the end of a
41 // period, a new period is started.
42 void Use(size_t used, double time);
43
44 size_t used_in_period() const {
45 return used_in_period_;
46 }
47
48 size_t max_per_period() const {
49 return max_per_period_;
50 }
51
52 private:
53 size_t max_per_period_;
54 double period_length_;
55 size_t used_in_period_;
56 double period_start_;
57 double period_end_;
58};
59
60} // namespace rtc
henrike@webrtc.org47be73b2014-05-13 18:00:2661
Henrik Kjellanderfb3e1b62017-06-29 06:03:0462#endif // WEBRTC_RTC_BASE_RATELIMITER_H_