1#ifndef LIBFILEZILLA_RATE_LIMITER_HEADER
2#define LIBFILEZILLA_RATE_LIMITER_HEADER
22 unlimited =
static_cast<type>(-1)
74 std::atomic<int> activity_{2};
76 std::vector<rate_limiter*> limiters_;
78 std::atomic<timer_id> timer_{};
80 std::atomic<rate::type> burst_tolerance_{1};
118 virtual size_t weight()
const {
return 1; }
125 virtual size_t unsaturated(direction::type
const )
const {
return 0; }
143 virtual rate::type
add_tokens(direction::type
const , rate::type , rate::type ) = 0;
171 size_t idx_{
static_cast<size_t>(-1)};
209 rate::type
limit(direction::type
const d);
221 virtual size_t FZ_PRIVATE_SYMBOL unsaturated(direction::type
const d)
const override {
return data_[
d].unused_capacity_ ? data_[
d].unsaturated_ : 0; }
224 virtual rate::type
FZ_PRIVATE_SYMBOL add_tokens(direction::type
const d, rate::type
tokens, rate::type limit)
override;
231 virtual std::array<rate::type, 2>
FZ_PRIVATE_SYMBOL gather_unspent_for_removal()
override;
233 std::vector<bucket_base*> buckets_;
234 std::vector<size_t> scratch_buffer_;
238 rate::type limit_{rate::unlimited};
239 rate::type merged_tokens_{};
240 rate::type overflow_{};
242 rate::type unused_capacity_{};
244 size_t unsaturated_{};
286 virtual void update_stats(
bool &
active)
override final;
287 virtual size_t unsaturated(direction::type
const d)
const override final {
return data_[
d].unsaturated_ ? 1 : 0; }
289 virtual rate::type add_tokens(direction::type
const d, rate::type
tokens, rate::type limit)
override final;
290 virtual rate::type distribute_overflow(direction::type
const d, rate::type
tokens)
override final;
297 rate::type available_{rate::unlimited};
298 rate::type overflow_multiplier_{1};
299 rate::type bucket_size_{rate::unlimited};
Base class for buckets.
Definition rate_limiter.hpp:85
virtual rate::type add_tokens(direction::type const, rate::type, rate::type)=0
Recursively adds tokens.
virtual size_t weight() const
Returns the weight of the tree.
Definition rate_limiter.hpp:118
virtual void update_stats(bool &active)=0
Updates weight and usage statistics.
virtual rate::type distribute_overflow(direction::type const, rate::type)
Recursively distributes overflow.
Definition rate_limiter.hpp:154
virtual std::array< rate::type, 2 > gather_unspent_for_removal()=0
Gather unspent tokens during removal to repay debt.
virtual size_t unsaturated(direction::type const) const
Returns the number of buckets not yet full.
Definition rate_limiter.hpp:125
virtual void remove_bucket()
virtual void set_mgr_recursive(rate_limit_manager *mgr)
Recursively sets the manager.
virtual void lock_tree()
Recursively locks the mutexes of self and all children.
Definition rate_limiter.hpp:104
virtual void unlock_tree()
Recursively unlocks the mutexes of self and all children.
Definition rate_limiter.hpp:159
A rate-limited token bucket.
Definition rate_limiter.hpp:253
rate::type available(direction::type const d)
Returns available octets.
virtual void remove_bucket() override
void consume(direction::type const d, rate::type amount)
Consumes octets.
virtual void wakeup(direction::type)
Called in response to unlock_tree if tokens have become available.
Definition rate_limiter.hpp:280
bool waiting(scoped_lock &l, direction::type d)
Call with the bucket_base mutex lock.
Common base class for all events.
Definition event.hpp:23
Simple handler for asynchronous event processing.
Definition event_handler.hpp:55
A threaded event loop that supports sending events and timers.
Definition event_loop.hpp:34
Lean replacement for std::(recursive_)mutex.
Definition mutex.hpp:52
The process class manages an asynchronous process with redirected IO.
Definition process.hpp:61
Context for rate_limiters.
Definition rate_limiter.hpp:46
void add(rate_limiter *limiter)
Adds a limiter to the manager.
void set_burst_tolerance(rate::type tolerance)
Burst tolerance, a multiplier to bucket size, helps achieving the average rate on bursty connections.
A limiter for the attached buckets.
Definition rate_limiter.hpp:185
void add(bucket_base *bucket)
Adds a bucket to the limiter.
void set_limits(rate::type download_limit, rate::type upload_limit)
Sets the number of octets all buckets combined may consume each second.
rate::type limit(direction::type const d)
Returns current limit.
A simple scoped lock.
Definition mutex.hpp:93
Declares the event_handler class.
type
Definition logger.hpp:16
The namespace used by libfilezilla.
Definition apply.hpp:17
bool dispatch(event_base const &ev, F &&f)
Dispatch for simple_event<> based events to simple functors.
Definition event_handler.hpp:199