aboutsummaryrefslogtreecommitdiff
path: root/src/threadinterrupt.cpp
diff options
context:
space:
mode:
authorWladimir J. van der Laan <[email protected]>2017-01-04 12:20:43 +0100
committerWladimir J. van der Laan <[email protected]>2017-01-04 12:21:53 +0100
commitd9ae1cefa081c7ef978fab0b288475692678af72 (patch)
treeaaafc90d4a0ef9a6ac14f6787a4d8852705e095f /src/threadinterrupt.cpp
parentMerge #9450: Increment MIT licence copyright header year on files modified in... (diff)
parentnet: misc header cleanups (diff)
downloaddiscoin-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.cpp41
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));
+}