1 #ifndef LIBFILEZILLA_RATE_LIMITER_HEADER 2 #define LIBFILEZILLA_RATE_LIMITER_HEADER 20 using type = uint64_t;
22 unlimited =
static_cast<type>(-1)
60 void set_burst_tolerance(rate::type tolerance);
67 void record_activity();
70 void on_timer(timer_id
const&);
75 std::vector<rate_limiter*> limiters_;
77 std::atomic<timer_id> timer_{};
79 std::atomic<int> activity_{2};
81 std::atomic<rate::type> burst_tolerance_{1};
112 virtual void update_stats(
bool & active) = 0;
119 virtual size_t weight()
const {
return 1; }
126 virtual size_t unsaturated(direction::type
const )
const {
return 0; }
144 virtual rate::type add_tokens(direction::type
const , rate::type , rate::type ) = 0;
167 virtual std::array<rate::type, 2> gather_unspent_for_removal() = 0;
170 rate_limit_manager * mgr_{};
172 size_t idx_{
static_cast<size_t>(-1)};
207 void set_limits(rate::type download_limit, rate::type upload_limit);
210 rate::type limit(direction::type
const d);
216 virtual void lock_tree()
override;
218 bool do_set_limit(direction::type
const d, rate::type limit);
220 virtual void update_stats(
bool & active)
override;
221 virtual size_t weight()
const override {
return weight_; }
222 virtual size_t unsaturated(direction::type
const d)
const override {
return data_[d].unused_capacity_ ? data_[d].unsaturated_ : 0; }
225 virtual rate::type add_tokens(direction::type
const d, rate::type tokens, rate::type limit)
override;
226 virtual rate::type distribute_overflow(direction::type
const d, rate::type tokens)
override;
228 virtual void unlock_tree()
override;
230 void pay_debt(direction::type
const d);
232 virtual std::array<rate::type, 2> gather_unspent_for_removal()
override;
234 std::vector<bucket_base*> buckets_;
235 std::vector<size_t> scratch_buffer_;
239 rate::type limit_{rate::unlimited};
240 rate::type merged_tokens_;
241 rate::type overflow_{};
243 rate::type unused_capacity_{};
245 size_t unsaturated_{};
262 rate::type available(direction::type
const d);
270 void consume(direction::type
const d, rate::type amount);
281 virtual void update_stats(
bool & active)
override;
282 virtual size_t unsaturated(direction::type
const d)
const override {
return data_[d].unsaturated_ ? 1 : 0; }
284 virtual rate::type add_tokens(direction::type
const d, rate::type tokens, rate::type limit)
override;
285 virtual rate::type distribute_overflow(direction::type
const d, rate::type tokens)
override;
287 virtual void unlock_tree()
override;
289 virtual std::array<rate::type, 2> gather_unspent_for_removal()
override;
292 rate::type available_{rate::unlimited};
293 rate::type overflow_multiplier_{1};
294 rate::type bucket_size_{rate::unlimited};
virtual size_t weight() const
Returns the weight of the tree.
Definition: rate_limiter.hpp:119
Context for rate_limiters.
Definition: rate_limiter.hpp:45
A rate-limited token bucket.
Definition: rate_limiter.hpp:252
Simple handler for asynchronous event processing.
Definition: event_handler.hpp:54
Declares the event_handler class.
virtual void unlock_tree()
Recursively unlocks the mutexes of self and all childen.
Definition: rate_limiter.hpp:160
virtual rate::type distribute_overflow(direction::type const, rate::type)
Recursively distributes overflow.
Definition: rate_limiter.hpp:155
virtual void wakeup(direction::type)
Called in response to unlock_tree if tokens have become available.
Definition: rate_limiter.hpp:278
type
Definition: logger.hpp:15
A threaded event loop that supports sending events and timers.
Definition: event_loop.hpp:33
A limiter for the attached buckets.
Definition: rate_limiter.hpp:185
Base class for buckets.
Definition: rate_limiter.hpp:85
The namespace used by libfilezilla.
Definition: apply.hpp:17
virtual size_t unsaturated(direction::type const) const
Returns the number of buckets not yet full.
Definition: rate_limiter.hpp:126
virtual void lock_tree()
Recursively locks the mutexes of self and all children.
Definition: rate_limiter.hpp:105
The process class manages an asynchronous process with redirected IO.
Definition: process.hpp:21
Lean replacement for std::(recursive_)mutex.
Definition: mutex.hpp:27
Common base class for all events.
Definition: event.hpp:22