summaryrefslogtreecommitdiffstats
path: root/src/crimson/thread/Throttle.h
blob: c2342171baacebbd9c705aa0a1d1c75696327992 (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
// -*- 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>

#include "common/ThrottleInterface.h"

namespace ceph::thread {

class Throttle final : public ThrottleInterface {
  size_t max = 0;
  size_t count = 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;
  }
  void reset_max(size_t m);
private:
  bool _should_wait(size_t c) const;
};

} // namespace ceph::thread