Cory Fields
8 years ago
3 changed files with 77 additions and 0 deletions
@ -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 @@ |
|||||||
|
// 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