Branch data Line data Source code
1 : : // Copyright (c) 2016-2022 The Bitcoin Core developers 2 : : // Distributed under the MIT software license, see the accompanying 3 : : // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 : : 5 : : #ifndef BITCOIN_UTIL_THREADINTERRUPT_H 6 : : #define BITCOIN_UTIL_THREADINTERRUPT_H 7 : : 8 : : #include <sync.h> 9 : : #include <threadsafety.h> 10 : : 11 : : #include <atomic> 12 : : #include <chrono> 13 : : #include <condition_variable> 14 : : 15 : : /** 16 : : * A helper class for interruptible sleeps. Calling operator() will interrupt 17 : : * any current sleep, and after that point operator bool() will return true 18 : : * until reset. 19 : : * 20 : : * This class should not be used in a signal handler. It uses thread 21 : : * synchronization primitives that are not safe to use with signals. If sending 22 : : * an interrupt from a signal handler is necessary, the \ref SignalInterrupt 23 : : * class can be used instead. 24 : : */ 25 : : 26 : 0 : class CThreadInterrupt 27 : : { 28 : : public: 29 : : using Clock = std::chrono::steady_clock; 30 : : CThreadInterrupt(); 31 : : explicit operator bool() const; 32 : : void operator()() EXCLUSIVE_LOCKS_REQUIRED(!mut); 33 : : void reset(); 34 : : bool sleep_for(Clock::duration rel_time) EXCLUSIVE_LOCKS_REQUIRED(!mut); 35 : : 36 : : private: 37 : : std::condition_variable cond; 38 : : Mutex mut; 39 : : std::atomic<bool> flag; 40 : : }; 41 : : 42 : : #endif // BITCOIN_UTIL_THREADINTERRUPT_H