diff options
| author | Wladimir J. van der Laan <[email protected]> | 2017-01-04 12:20:43 +0100 |
|---|---|---|
| committer | Wladimir J. van der Laan <[email protected]> | 2017-01-04 12:21:53 +0100 |
| commit | d9ae1cefa081c7ef978fab0b288475692678af72 (patch) | |
| tree | aaafc90d4a0ef9a6ac14f6787a4d8852705e095f /src/threadinterrupt.cpp | |
| parent | Merge #9450: Increment MIT licence copyright header year on files modified in... (diff) | |
| parent | net: misc header cleanups (diff) | |
| download | discoin-d9ae1cefa081c7ef978fab0b288475692678af72.tar.xz discoin-d9ae1cefa081c7ef978fab0b288475692678af72.zip | |
Merge #9289: net: drop boost::thread_group
67ee4ec net: misc header cleanups (Cory Fields)
8b3159e net: make proxy receives interruptible (Cory Fields)
5cb0fce net: remove thread_interrupted catch (Cory Fields)
d3d7056 net: make net processing interruptible (Cory Fields)
0985052 net: make net interruptible (Cory Fields)
799df91 net: add CThreadInterrupt and InterruptibleSleep (Cory Fields)
7325b15 net: a few small cleanups before replacing boost threads (Cory Fields)
Diffstat (limited to 'src/threadinterrupt.cpp')
| -rw-r--r-- | src/threadinterrupt.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/threadinterrupt.cpp b/src/threadinterrupt.cpp new file mode 100644 index 000000000..9d691079e --- /dev/null +++ b/src/threadinterrupt.cpp @@ -0,0 +1,41 @@ +// Copyright (c) 2009-2010 Satoshi Nakamoto +// Copyright (c) 2009-2016 The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include "threadinterrupt.h" + +CThreadInterrupt::operator bool() const +{ + return flag.load(std::memory_order_acquire); +} + +void CThreadInterrupt::reset() +{ + flag.store(false, std::memory_order_release); +} + +void CThreadInterrupt::operator()() +{ + { + std::unique_lock<std::mutex> lock(mut); + flag.store(true, std::memory_order_release); + } + cond.notify_all(); +} + +bool CThreadInterrupt::sleep_for(std::chrono::milliseconds rel_time) +{ + std::unique_lock<std::mutex> lock(mut); + return !cond.wait_for(lock, rel_time, [this]() { return flag.load(std::memory_order_acquire); }); +} + +bool CThreadInterrupt::sleep_for(std::chrono::seconds rel_time) +{ + return sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(rel_time)); +} + +bool CThreadInterrupt::sleep_for(std::chrono::minutes rel_time) +{ + return sleep_for(std::chrono::duration_cast<std::chrono::milliseconds>(rel_time)); +} |