parent
7325b15566
commit
799df9115f
@ -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