blob: 8ff2c13b6a730169be543b3ea2bac323fc7c13d9 (
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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
|
#ifndef CEPH_THROTTLE_H
#define CEPH_THROTTLE_H
#include <list>
#include "include/atomic.h"
#include "common/Mutex.h"
#include "common/Cond.h"
class CephContext;
class PerfCounters;
class Throttle {
CephContext *cct;
std::string name;
PerfCounters *logger;
ceph::atomic_t count, max;
Mutex lock;
list<Cond*> cond;
public:
Throttle(CephContext *cct, std::string n, int64_t m = 0);
~Throttle();
private:
void _reset_max(int64_t m);
bool _should_wait(int64_t c) {
int64_t m = max.read();
int64_t cur = count.read();
return
m &&
((c <= m && cur + c > m) || // normally stay under max
(c >= m && cur > m)); // except for large c
}
bool _wait(int64_t c);
public:
int64_t get_current() {
return count.read();
}
int64_t get_max() { return max.read(); }
bool wait(int64_t m = 0);
int64_t take(int64_t c = 1);
bool get(int64_t c = 1, int64_t m = 0);
/**
* Returns true if it successfully got the requested amount,
* or false if it would block.
*/
bool get_or_fail(int64_t c = 1);
int64_t put(int64_t c = 1);
};
#endif
|