From e3ed38d19cd07e9eac04bde686caac5f6177700b Mon Sep 17 00:00:00 2001 From: Akio Nakamura Date: Wed, 23 Jan 2019 10:57:16 +0900 Subject: [PATCH] Prevent mutex lock fail even if --enable-debug This PR intends to resolve #15227. "configure --debug-enabled" enables "#ifdef DEBUG_LOCKORDER". Then "lockdata" (in sync.cpp) will be initialized same as other static objects. But unfortunately, lockdata.push_lock() was called before its initialization (via initializing signatureCache which is declared in script/sigcache.cpp) on macOS. This PR apply the "Construct On First Use Idiom" to "lockdata" to prevent it. (cherry picked from commit b09dab0f2de37be3c96f5087ee7bd61d7262aa76) --- src/sync.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/sync.cpp b/src/sync.cpp index 11d44cb97..da839ecae 100644 --- a/src/sync.cpp +++ b/src/sync.cpp @@ -70,7 +70,11 @@ struct LockData { LockOrders lockorders; InvLockOrders invlockorders; boost::mutex dd_mutex; -} static lockdata; +}; +LockData& GetLockData() { + static LockData lockdata; + return lockdata; +} boost::thread_specific_ptr lockstack; @@ -129,6 +133,7 @@ static void push_lock(void* c, const CLockLocation& locklocation, bool fTry) if (lockstack.get() == NULL) lockstack.reset(new LockStack); + LockData& lockdata = GetLockData(); boost::unique_lock lock(lockdata.dd_mutex); (*lockstack).push_back(std::make_pair(c, locklocation)); @@ -195,6 +200,7 @@ void AssertLockNotHeldInternal(const char* pszName, const char* pszFile, int nLi void DeleteLock(void* cs) { + LockData& lockdata = GetLockData(); if (!lockdata.available) { // We're already shutting down. return;