1#pragma once
2#include <memory>
3#include <atomic>
4
5
6namespace DB
7{
8
9class ActionBlocker;
10using StorageActionBlockType = size_t;
11
12/// Blocks related action while a ActionLock instance exists
13/// ActionBlocker could be destroyed before the lock, in this case ActionLock will safely do nothing in its destructor
14class ActionLock
15{
16public:
17
18 ActionLock() = default;
19
20 explicit ActionLock(const ActionBlocker & blocker);
21
22 ActionLock(ActionLock && other);
23 ActionLock & operator=(ActionLock && other);
24
25 ActionLock(const ActionLock & other) = delete;
26 ActionLock & operator=(const ActionLock & other) = delete;
27
28 bool expired() const
29 {
30 return counter_ptr.expired();
31 }
32
33 ~ActionLock()
34 {
35 if (auto counter = counter_ptr.lock())
36 --(*counter);
37 }
38
39private:
40 using Counter = std::atomic<int>;
41 using CounterWeakPtr = std::weak_ptr<Counter>;
42
43 CounterWeakPtr counter_ptr;
44};
45
46}
47