Cory Fields
8 years ago
3 changed files with 77 additions and 0 deletions
@ -0,0 +1,41 @@
@@ -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)); |
||||
} |
@ -0,0 +1,34 @@
@@ -0,0 +1,34 @@
|
||||
// Copyright (c) 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.
|
||||
|
||||
#ifndef BITCOIN_THREADINTERRUPT_H |
||||
#define BITCOIN_THREADINTERRUPT_H |
||||
|
||||
#include <atomic> |
||||
#include <chrono> |
||||
#include <condition_variable> |
||||
#include <mutex> |
||||
|
||||
/*
|
||||
A helper class for interruptible sleeps. Calling operator() will interrupt |
||||
any current sleep, and after that point operator bool() will return true |
||||
until reset. |
||||
*/ |
||||
class CThreadInterrupt |
||||
{ |
||||
public: |
||||
explicit operator bool() const; |
||||
void operator()(); |
||||
void reset(); |
||||
bool sleep_for(std::chrono::milliseconds rel_time); |
||||
bool sleep_for(std::chrono::seconds rel_time); |
||||
bool sleep_for(std::chrono::minutes rel_time); |
||||
|
||||
private: |
||||
std::condition_variable cond; |
||||
std::mutex mut; |
||||
std::atomic<bool> flag; |
||||
}; |
||||
|
||||
#endif //BITCOIN_THREADINTERRUPT_H
|
Loading…
Reference in new issue