Skip to content

Commit

Permalink
net: add CThreadInterrupt and InterruptibleSleep
Browse files Browse the repository at this point in the history
  • Loading branch information
theuni authored and Fuzzbawls committed Aug 25, 2020
1 parent 1443f2a commit 814d0de
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 0 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Expand Up @@ -416,6 +416,7 @@ set(UTIL_SOURCES
./src/random.cpp
./src/rpc/protocol.cpp
./src/sync.cpp
./src/threadinterrupt.cpp
./src/blob_uint256.cpp
./src/arith_uint256.cpp
./src/uint256.cpp
Expand Down
2 changes: 2 additions & 0 deletions src/Makefile.am
Expand Up @@ -244,6 +244,7 @@ BITCOIN_CORE_H = \
support/cleanse.h \
sync.h \
threadsafety.h \
threadinterrupt.h \
timedata.h \
tinyformat.h \
torcontrol.h \
Expand Down Expand Up @@ -513,6 +514,7 @@ libbitcoin_util_a_SOURCES = \
rpc/protocol.cpp \
support/cleanse.cpp \
sync.cpp \
threadinterrupt.cpp \
uint256.cpp \
blob_uint256.cpp \
util.cpp \
Expand Down
41 changes: 41 additions & 0 deletions 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));
}
34 changes: 34 additions & 0 deletions src/threadinterrupt.h
@@ -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

0 comments on commit 814d0de

Please sign in to comment.