Branch data Line data Source code
1 : : // Copyright (c) 2023 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_SIGNALINTERRUPT_H 6 : : #define BITCOIN_UTIL_SIGNALINTERRUPT_H 7 : : 8 : : #ifdef WIN32 9 : : #include <condition_variable> 10 : : #include <mutex> 11 : : #else 12 : : #include <util/tokenpipe.h> 13 : : #endif 14 : : 15 : : #include <atomic> 16 : : #include <cstdlib> 17 : : 18 : : namespace util { 19 : : /** 20 : : * Helper class that manages an interrupt flag, and allows a thread or 21 : : * signal to interrupt another thread. 22 : : * 23 : : * This class is safe to be used in a signal handler. If sending an interrupt 24 : : * from a signal handler is not necessary, the more lightweight \ref 25 : : * CThreadInterrupt class can be used instead. 26 : : */ 27 : : 28 : 0 : class SignalInterrupt 29 : : { 30 : : public: 31 : : SignalInterrupt(); 32 : : explicit operator bool() const; 33 : : void operator()(); 34 : : void reset(); 35 : : void wait(); 36 : : 37 : : private: 38 : : std::atomic<bool> m_flag; 39 : : 40 : : #ifndef WIN32 41 : : // On UNIX-like operating systems use the self-pipe trick. 42 : : TokenPipeEnd m_pipe_r; 43 : : TokenPipeEnd m_pipe_w; 44 : : #else 45 : : // On windows use a condition variable, since we don't have any signals there 46 : : std::mutex m_mutex; 47 : : std::condition_variable m_cv; 48 : : #endif 49 : : }; 50 : : } // namespace util 51 : : 52 : : #endif // BITCOIN_UTIL_SIGNALINTERRUPT_H