Home | History | Annotate | Download | only in base
      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.
     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