]> git.proxmox.com Git - ceph.git/blame - ceph/src/common/AsyncOpTracker.h
import 15.2.2 octopus source
[ceph.git] / ceph / src / common / AsyncOpTracker.h
CommitLineData
7c673cae
FG
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3
4#ifndef CEPH_ASYNC_OP_TRACKER_H
5#define CEPH_ASYNC_OP_TRACKER_H
6
11fdf7f2 7#include "common/ceph_mutex.h"
1911f103 8#include "include/Context.h"
7c673cae
FG
9
10class AsyncOpTracker {
11public:
12 AsyncOpTracker();
13 ~AsyncOpTracker();
14
15 void start_op();
16 void finish_op();
17
18 void wait_for_ops(Context *on_finish);
19
20 bool empty();
21
22private:
11fdf7f2 23 ceph::mutex m_lock = ceph::make_mutex("AsyncOpTracker::m_lock");
7c673cae
FG
24 uint32_t m_pending_ops = 0;
25 Context *m_on_finish = nullptr;
26
27};
28
1911f103
TL
29class C_TrackedOp : public Context {
30public:
31 C_TrackedOp(AsyncOpTracker& async_op_tracker, Context* on_finish)
32 : m_async_op_tracker(async_op_tracker), m_on_finish(on_finish) {
33 m_async_op_tracker.start_op();
34 }
35
36 void finish(int r) override {
37 if (m_on_finish != nullptr) {
38 m_on_finish->complete(r);
39 }
40 m_async_op_tracker.finish_op();
41 }
42
43private:
44 AsyncOpTracker& m_async_op_tracker;
45 Context* m_on_finish;
46};
47
7c673cae 48#endif // CEPH_ASYNC_OP_TRACKER_H