]>
Commit | Line | Data |
---|---|---|
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 | #include "common/AsyncOpTracker.h" | |
7c673cae FG |
5 | #include "include/Context.h" |
6 | ||
7 | AsyncOpTracker::AsyncOpTracker() | |
8 | : m_lock("AsyncOpTracker::m_lock", false, false) { | |
9 | } | |
10 | ||
11 | AsyncOpTracker::~AsyncOpTracker() { | |
12 | Mutex::Locker locker(m_lock); | |
13 | assert(m_pending_ops == 0); | |
14 | } | |
15 | ||
16 | void AsyncOpTracker::start_op() { | |
17 | Mutex::Locker locker(m_lock); | |
18 | ++m_pending_ops; | |
19 | } | |
20 | ||
21 | void AsyncOpTracker::finish_op() { | |
22 | Context *on_finish = nullptr; | |
23 | { | |
24 | Mutex::Locker locker(m_lock); | |
25 | assert(m_pending_ops > 0); | |
26 | if (--m_pending_ops == 0) { | |
27 | std::swap(on_finish, m_on_finish); | |
28 | } | |
29 | } | |
30 | ||
31 | if (on_finish != nullptr) { | |
32 | on_finish->complete(0); | |
33 | } | |
34 | } | |
35 | ||
36 | void AsyncOpTracker::wait_for_ops(Context *on_finish) { | |
37 | { | |
38 | Mutex::Locker locker(m_lock); | |
39 | assert(m_on_finish == nullptr); | |
40 | if (m_pending_ops > 0) { | |
41 | m_on_finish = on_finish; | |
42 | return; | |
43 | } | |
44 | } | |
45 | on_finish->complete(0); | |
46 | } | |
47 | ||
48 | bool AsyncOpTracker::empty() { | |
49 | Mutex::Locker locker(m_lock); | |
50 | return (m_pending_ops == 0); | |
51 | } | |
52 |