blob: cf5d6b05b5227f46e42128d54880506b7f58b86e [file] [log] [blame]
henrike@webrtc.orgf7795df2014-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
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_