blob: 85706d3dde31d5c6cd9aabd4f28808c5d0cb8629 [file] [log] [blame]
henrike@webrtc.orgf0488722014-05-13 18:00:26 +00001/*
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
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef RTC_BASE_RATELIMITER_H_
12#define RTC_BASE_RATELIMITER_H_
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000013
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020014#include <stddef.h>
henrike@webrtc.orgf0488722014-05-13 18:00:26 +000015
Henrik Kjellanderec78f1c2017-06-29 07:52:50 +020016namespace 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.orgf0488722014-05-13 18:00:26 +000061
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020062#endif // RTC_BASE_RATELIMITER_H_