diff --git a/src/init.cpp b/src/init.cpp index 3c8aaf570..70060bb70 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -555,14 +555,14 @@ static void TxExpiryNotifyCallback(const uint256& txid) } static bool fHaveGenesis = false; -static boost::mutex cs_GenesisWait; +static CWaitableCriticalSection cs_GenesisWait; static CConditionVariable condvar_GenesisWait; static void BlockNotifyGenesisWait(bool, const CBlockIndex *pBlockIndex) { if (pBlockIndex != NULL) { { - boost::unique_lock lock_GenesisWait(cs_GenesisWait); + WaitableLock lock_GenesisWait(cs_GenesisWait); fHaveGenesis = true; } condvar_GenesisWait.notify_all(); @@ -1905,7 +1905,7 @@ bool AppInit2(boost::thread_group& threadGroup, CScheduler& scheduler) // Wait for genesis block to be processed { - boost::unique_lock lock(cs_GenesisWait); + WaitableLock lock(cs_GenesisWait); while (!fHaveGenesis) { condvar_GenesisWait.wait(lock); } diff --git a/src/main.cpp b/src/main.cpp index bb60de9a3..11a9b89a6 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3863,7 +3863,7 @@ void static UpdateTip(CBlockIndex *pindexNew, const CChainParams& chainParams) { RenderPoolMetrics("transparent", transparentPool); { - boost::unique_lock lock(g_best_block_mutex); + WaitableLock lock(g_best_block_mutex); g_best_block = pindexNew->GetBlockHash(); g_best_block_height = pindexNew->nHeight; g_best_block_cv.notify_all(); diff --git a/src/rpc/mining.cpp b/src/rpc/mining.cpp index 0469250e6..990cf34b0 100644 --- a/src/rpc/mining.cpp +++ b/src/rpc/mining.cpp @@ -601,7 +601,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp) { // Wait to respond until either the best block changes, OR some time passes and there are more transactions uint256 hashWatchedChain; - boost::system_time checktxtime; + std::chrono::steady_clock::time_point checktxtime; unsigned int nTransactionsUpdatedLastLP; if (lpval.isStr()) @@ -623,9 +623,9 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp) // Don't call chainActive->Tip() without holding cs_main LEAVE_CRITICAL_SECTION(cs_main); { - checktxtime = boost::get_system_time() + boost::posix_time::seconds(10); + checktxtime = std::chrono::steady_clock::now() + std::chrono::seconds(10); - boost::unique_lock lock(g_best_block_mutex); + WaitableLock lock(g_best_block_mutex); while (g_best_block == hashWatchedChain && IsRPCRunning()) { // Before waiting, generate the coinbase for the block following the next @@ -640,7 +640,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp) Params(), CAmount{0}, minerAddress, cached_next_cb_height); next_cb_mtx = cached_next_cb_mtx; } - bool timedout = !g_best_block_cv.timed_wait(lock, checktxtime); + bool timedout = g_best_block_cv.wait_until(lock, checktxtime) == std::cv_status::timeout; // Optimization: even if timed out, a new block may have arrived // while waiting for cs_main; if so, don't discard next_cb_mtx. @@ -652,7 +652,7 @@ UniValue getblocktemplate(const UniValue& params, bool fHelp) next_cb_mtx = nullopt; break; } - checktxtime += boost::posix_time::seconds(10); + checktxtime += std::chrono::seconds(10); } if (g_best_block_height != nHeight + 1) { // Unexpected height (reorg or >1 blocks arrived while waiting) invalidates coinbase tx. diff --git a/src/sync.h b/src/sync.h index 1aa605ffa..09e1da0b7 100644 --- a/src/sync.h +++ b/src/sync.h @@ -12,7 +12,9 @@ #include #include #include -#include +#include +#include +#include //////////////////////////////////////////////// @@ -23,17 +25,17 @@ /* CCriticalSection mutex; - boost::recursive_mutex mutex; + std::recursive_mutex mutex; LOCK(mutex); - boost::unique_lock criticalblock(mutex); + std::unique_lock criticalblock(mutex); LOCK2(mutex1, mutex2); - boost::unique_lock criticalblock1(mutex1); - boost::unique_lock criticalblock2(mutex2); + std::unique_lock criticalblock1(mutex1); + std::unique_lock criticalblock2(mutex2); TRY_LOCK(mutex, name); - boost::unique_lock name(mutex, boost::try_to_lock_t); + std::unique_lock name(mutex, std::try_to_lock_t); ENTER_CRITICAL_SECTION(mutex); // no RAII mutex.lock(); @@ -90,10 +92,10 @@ void static inline DeleteLock(void* cs) {} #define AssertLockNotHeld(cs) AssertLockNotHeldInternal(#cs, __FILE__, __LINE__, &cs) /** - * Wrapped boost mutex: supports recursive locking, but no waiting + * Wrapped mutex: supports recursive locking, but no waiting * TODO: We should move away from using the recursive lock by default. */ -class CCriticalSection : public AnnotatedMixin +class CCriticalSection : public AnnotatedMixin { public: ~CCriticalSection() { @@ -101,22 +103,24 @@ public: } }; -/** Wrapped boost mutex: supports waiting but not recursive locking */ -typedef AnnotatedMixin CWaitableCriticalSection; +/** Wrapped mutex: supports waiting but not recursive locking */ +typedef AnnotatedMixin CWaitableCriticalSection; -/** Just a typedef for boost::condition_variable, can be wrapped later if desired */ -typedef boost::condition_variable CConditionVariable; +/** Just a typedef for std::condition_variable, can be wrapped later if desired */ +typedef std::condition_variable CConditionVariable; + +/** Just a typedef for std::unique_lock, can be wrapped later if desired */ +typedef std::unique_lock WaitableLock; #ifdef DEBUG_LOCKCONTENTION void PrintLockContention(const char* pszName, const char* pszFile, int nLine); #endif -/** Wrapper around boost::unique_lock */ -template -class SCOPED_LOCKABLE CMutexLock +/** Wrapper around std::unique_lock */ +class SCOPED_LOCKABLE CCriticalBlock { private: - boost::unique_lock lock; + std::unique_lock lock; void Enter(const char* pszName, const char* pszFile, int nLine) { @@ -141,7 +145,7 @@ private: } public: - CMutexLock(Mutex& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(mutexIn) : lock(mutexIn, boost::defer_lock) + CCriticalBlock(CCriticalSection& mutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(mutexIn) : lock(mutexIn, std::defer_lock) { if (fTry) TryEnter(pszName, pszFile, nLine); @@ -149,18 +153,18 @@ public: Enter(pszName, pszFile, nLine); } - CMutexLock(Mutex* pmutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(pmutexIn) + CCriticalBlock(CCriticalSection* pmutexIn, const char* pszName, const char* pszFile, int nLine, bool fTry = false) EXCLUSIVE_LOCK_FUNCTION(pmutexIn) { if (!pmutexIn) return; - lock = boost::unique_lock(*pmutexIn, boost::defer_lock); + lock = std::unique_lock(*pmutexIn, std::defer_lock); if (fTry) TryEnter(pszName, pszFile, nLine); else Enter(pszName, pszFile, nLine); } - ~CMutexLock() UNLOCK_FUNCTION() + ~CCriticalBlock() UNLOCK_FUNCTION() { if (lock.owns_lock()) LeaveCritical(); @@ -172,8 +176,6 @@ public: } }; -typedef CMutexLock CCriticalBlock; - #define PASTE(x, y) x ## y #define PASTE2(x, y) PASTE(x, y) diff --git a/test/lint/lint-includes.sh b/test/lint/lint-includes.sh index 66aec123c..b95e54c55 100755 --- a/test/lint/lint-includes.sh +++ b/test/lint/lint-includes.sh @@ -91,7 +91,6 @@ EXPECTED_BOOST_INCLUDES=( boost/thread/locks.hpp boost/thread/mutex.hpp boost/thread/once.hpp - boost/thread/recursive_mutex.hpp boost/thread/synchronized_value.hpp boost/thread/thread.hpp boost/thread/tss.hpp