blob: 2998cb5f84317cf884b693e4fd9c07a69b827440 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*-
// vim: ts=8 sw=2 smarttab
#pragma once
#include <seastar/core/condition-variable.hh>
// pull seastar::timer<...>::timer definitions. FIX SEASTAR or reactor.hh
// is obligatory and should be included everywhere?
#include <seastar/core/reactor.hh>
#include "common/ThrottleInterface.h"
namespace crimson::common {
class Throttle final : public ThrottleInterface {
size_t max = 0;
size_t count = 0;
size_t pending = 0;
// we cannot change the "count" of seastar::semaphore after it is created,
// so use condition_variable instead.
seastar::condition_variable on_free_slots;
public:
explicit Throttle(size_t m)
: max(m)
{}
int64_t take(int64_t c = 1) override;
int64_t put(int64_t c = 1) override;
seastar::future<> get(size_t c);
size_t get_current() const {
return count;
}
size_t get_max() const {
return max;
}
size_t get_pending() const {
return pending;
}
void reset_max(size_t m);
private:
bool _should_wait(size_t c) const;
};
} // namespace crimson::common
|