mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-03 09:56:38 -05:00
Merge #18635: Replace -Wthread-safety-analysis with broader -Wthread-safety
87766b355c
build: Replace -Wthread-safety-analysis with broader -Wthread-safety (Hennadii Stepanov)9cc6eb3c9e
Get rid of -Wthread-safety-precise warnings (Hennadii Stepanov)971a468ccf
Use template function instead of void* parameter (Hennadii Stepanov)dfb75ae49d
refactor: Rename LockGuard to StdLockGuard for consistency with StdMutex (Hennadii Stepanov)79be487420
Add thread safety annotated wrapper for std::mutex (Hennadii Stepanov) Pull request description: This PR gets rid of `-Wthread-safety-attributes` and `-Wthread-safety-precise` warnings, and replaces `-Wthread-safety-analysis` compiler option with the broader `-Wthread-safety` one. ACKs for top commit: practicalswift: ACK87766b355c
-- patch looks correct ajtowns: ACK87766b355c
MarcoFalke: ACK87766b355c
👍 vasild: ACK87766b3
Tree-SHA512: b1fe29f2568c954c612f964f9022a1f02333fae4a62c8c16c45e83f5f50a27231fc60b6bd369ccd3bbdb42ef4a0f19defde350c31a62613082ffbc9d7e383a5f
This commit is contained in:
commit
082a417abc
9 changed files with 34 additions and 24 deletions
|
@ -381,7 +381,7 @@ if test "x$enable_werror" = "xyes"; then
|
||||||
AX_CHECK_COMPILE_FLAG([-Werror=gnu],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=gnu"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Werror=gnu],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=gnu"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Werror=vla],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=vla"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Werror=vla],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=vla"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Werror=switch],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=switch"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Werror=switch],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=switch"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Werror=thread-safety-analysis],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=thread-safety-analysis"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Werror=thread-safety],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=thread-safety"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Werror=unused-variable],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=unused-variable"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Werror=unused-variable],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=unused-variable"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Werror=date-time],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=date-time"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Werror=date-time],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=date-time"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Werror=return-type],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=return-type"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Werror=return-type],[ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror=return-type"],,[[$CXXFLAG_WERROR]])
|
||||||
|
@ -401,7 +401,7 @@ if test "x$CXXFLAGS_overridden" = "xno"; then
|
||||||
AX_CHECK_COMPILE_FLAG([-Wvla],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wvla"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Wvla],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wvla"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Wswitch],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wswitch"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Wswitch],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wswitch"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Wformat-security],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wformat-security"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Wformat-security],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wformat-security"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Wthread-safety-analysis],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wthread-safety-analysis"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Wthread-safety],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wthread-safety"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Wrange-loop-analysis],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wrange-loop-analysis"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Wrange-loop-analysis],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wrange-loop-analysis"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Wredundant-decls],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wredundant-decls"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Wredundant-decls],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wredundant-decls"],,[[$CXXFLAG_WERROR]])
|
||||||
AX_CHECK_COMPILE_FLAG([-Wunused-variable],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wunused-variable"],,[[$CXXFLAG_WERROR]])
|
AX_CHECK_COMPILE_FLAG([-Wunused-variable],[WARN_CXXFLAGS="$WARN_CXXFLAGS -Wunused-variable"],,[[$CXXFLAG_WERROR]])
|
||||||
|
|
|
@ -105,13 +105,12 @@ ReadStatus PartiallyDownloadedBlock::InitData(const CBlockHeaderAndShortTxIDs& c
|
||||||
std::vector<bool> have_txn(txn_available.size());
|
std::vector<bool> have_txn(txn_available.size());
|
||||||
{
|
{
|
||||||
LOCK(pool->cs);
|
LOCK(pool->cs);
|
||||||
const std::vector<std::pair<uint256, CTxMemPool::txiter> >& vTxHashes = pool->vTxHashes;
|
for (size_t i = 0; i < pool->vTxHashes.size(); i++) {
|
||||||
for (size_t i = 0; i < vTxHashes.size(); i++) {
|
uint64_t shortid = cmpctblock.GetShortID(pool->vTxHashes[i].first);
|
||||||
uint64_t shortid = cmpctblock.GetShortID(vTxHashes[i].first);
|
|
||||||
std::unordered_map<uint64_t, uint16_t>::iterator idit = shorttxids.find(shortid);
|
std::unordered_map<uint64_t, uint16_t>::iterator idit = shorttxids.find(shortid);
|
||||||
if (idit != shorttxids.end()) {
|
if (idit != shorttxids.end()) {
|
||||||
if (!have_txn[idit->second]) {
|
if (!have_txn[idit->second]) {
|
||||||
txn_available[idit->second] = vTxHashes[i].second->GetSharedTx();
|
txn_available[idit->second] = pool->vTxHashes[i].second->GetSharedTx();
|
||||||
have_txn[idit->second] = true;
|
have_txn[idit->second] = true;
|
||||||
mempool_count++;
|
mempool_count++;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -126,7 +126,7 @@ class PartiallyDownloadedBlock {
|
||||||
protected:
|
protected:
|
||||||
std::vector<CTransactionRef> txn_available;
|
std::vector<CTransactionRef> txn_available;
|
||||||
size_t prefilled_count = 0, mempool_count = 0, extra_count = 0;
|
size_t prefilled_count = 0, mempool_count = 0, extra_count = 0;
|
||||||
CTxMemPool* pool;
|
const CTxMemPool* pool;
|
||||||
public:
|
public:
|
||||||
CBlockHeader header;
|
CBlockHeader header;
|
||||||
explicit PartiallyDownloadedBlock(CTxMemPool* poolIn) : pool(poolIn) {}
|
explicit PartiallyDownloadedBlock(CTxMemPool* poolIn) : pool(poolIn) {}
|
||||||
|
|
|
@ -41,7 +41,7 @@ static int FileWriteStr(const std::string &str, FILE *fp)
|
||||||
|
|
||||||
bool BCLog::Logger::StartLogging()
|
bool BCLog::Logger::StartLogging()
|
||||||
{
|
{
|
||||||
LockGuard scoped_lock(m_cs);
|
StdLockGuard scoped_lock(m_cs);
|
||||||
|
|
||||||
assert(m_buffering);
|
assert(m_buffering);
|
||||||
assert(m_fileout == nullptr);
|
assert(m_fileout == nullptr);
|
||||||
|
@ -80,7 +80,7 @@ bool BCLog::Logger::StartLogging()
|
||||||
|
|
||||||
void BCLog::Logger::DisconnectTestLogger()
|
void BCLog::Logger::DisconnectTestLogger()
|
||||||
{
|
{
|
||||||
LockGuard scoped_lock(m_cs);
|
StdLockGuard scoped_lock(m_cs);
|
||||||
m_buffering = true;
|
m_buffering = true;
|
||||||
if (m_fileout != nullptr) fclose(m_fileout);
|
if (m_fileout != nullptr) fclose(m_fileout);
|
||||||
m_fileout = nullptr;
|
m_fileout = nullptr;
|
||||||
|
@ -246,7 +246,7 @@ namespace BCLog {
|
||||||
|
|
||||||
void BCLog::Logger::LogPrintStr(const std::string& str)
|
void BCLog::Logger::LogPrintStr(const std::string& str)
|
||||||
{
|
{
|
||||||
LockGuard scoped_lock(m_cs);
|
StdLockGuard scoped_lock(m_cs);
|
||||||
std::string str_prefixed = LogEscapeMessage(str);
|
std::string str_prefixed = LogEscapeMessage(str);
|
||||||
|
|
||||||
if (m_log_threadnames && m_started_new_line) {
|
if (m_log_threadnames && m_started_new_line) {
|
||||||
|
|
|
@ -62,7 +62,7 @@ namespace BCLog {
|
||||||
class Logger
|
class Logger
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
mutable std::mutex m_cs; // Can not use Mutex from sync.h because in debug mode it would cause a deadlock when a potential deadlock was detected
|
mutable StdMutex m_cs; // Can not use Mutex from sync.h because in debug mode it would cause a deadlock when a potential deadlock was detected
|
||||||
|
|
||||||
FILE* m_fileout GUARDED_BY(m_cs) = nullptr;
|
FILE* m_fileout GUARDED_BY(m_cs) = nullptr;
|
||||||
std::list<std::string> m_msgs_before_open GUARDED_BY(m_cs);
|
std::list<std::string> m_msgs_before_open GUARDED_BY(m_cs);
|
||||||
|
@ -100,14 +100,14 @@ namespace BCLog {
|
||||||
/** Returns whether logs will be written to any output */
|
/** Returns whether logs will be written to any output */
|
||||||
bool Enabled() const
|
bool Enabled() const
|
||||||
{
|
{
|
||||||
LockGuard scoped_lock(m_cs);
|
StdLockGuard scoped_lock(m_cs);
|
||||||
return m_buffering || m_print_to_console || m_print_to_file || !m_print_callbacks.empty();
|
return m_buffering || m_print_to_console || m_print_to_file || !m_print_callbacks.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Connect a slot to the print signal and return the connection */
|
/** Connect a slot to the print signal and return the connection */
|
||||||
std::list<std::function<void(const std::string&)>>::iterator PushBackCallback(std::function<void(const std::string&)> fun)
|
std::list<std::function<void(const std::string&)>>::iterator PushBackCallback(std::function<void(const std::string&)> fun)
|
||||||
{
|
{
|
||||||
LockGuard scoped_lock(m_cs);
|
StdLockGuard scoped_lock(m_cs);
|
||||||
m_print_callbacks.push_back(std::move(fun));
|
m_print_callbacks.push_back(std::move(fun));
|
||||||
return --m_print_callbacks.end();
|
return --m_print_callbacks.end();
|
||||||
}
|
}
|
||||||
|
@ -115,7 +115,7 @@ namespace BCLog {
|
||||||
/** Delete a connection */
|
/** Delete a connection */
|
||||||
void DeleteCallback(std::list<std::function<void(const std::string&)>>::iterator it)
|
void DeleteCallback(std::list<std::function<void(const std::string&)>>::iterator it)
|
||||||
{
|
{
|
||||||
LockGuard scoped_lock(m_cs);
|
StdLockGuard scoped_lock(m_cs);
|
||||||
m_print_callbacks.erase(it);
|
m_print_callbacks.erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -219,12 +219,15 @@ static bool LockHeld(void* mutex)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs)
|
template <typename MutexType>
|
||||||
|
void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, MutexType* cs)
|
||||||
{
|
{
|
||||||
if (LockHeld(cs)) return;
|
if (LockHeld(cs)) return;
|
||||||
tfm::format(std::cerr, "Assertion failed: lock %s not held in %s:%i; locks held:\n%s", pszName, pszFile, nLine, LocksHeld());
|
tfm::format(std::cerr, "Assertion failed: lock %s not held in %s:%i; locks held:\n%s", pszName, pszFile, nLine, LocksHeld());
|
||||||
abort();
|
abort();
|
||||||
}
|
}
|
||||||
|
template void AssertLockHeldInternal(const char*, const char*, int, Mutex*);
|
||||||
|
template void AssertLockHeldInternal(const char*, const char*, int, RecursiveMutex*);
|
||||||
|
|
||||||
void AssertLockNotHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs)
|
void AssertLockNotHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs)
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,7 +52,8 @@ void EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs
|
||||||
void LeaveCritical();
|
void LeaveCritical();
|
||||||
void CheckLastCritical(void* cs, std::string& lockname, const char* guardname, const char* file, int line);
|
void CheckLastCritical(void* cs, std::string& lockname, const char* guardname, const char* file, int line);
|
||||||
std::string LocksHeld();
|
std::string LocksHeld();
|
||||||
void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs) ASSERT_EXCLUSIVE_LOCK(cs);
|
template <typename MutexType>
|
||||||
|
void AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, MutexType* cs) ASSERT_EXCLUSIVE_LOCK(cs);
|
||||||
void AssertLockNotHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs);
|
void AssertLockNotHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs);
|
||||||
void DeleteLock(void* cs);
|
void DeleteLock(void* cs);
|
||||||
|
|
||||||
|
@ -66,7 +67,8 @@ extern bool g_debug_lockorder_abort;
|
||||||
void static inline EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs, bool fTry = false) {}
|
void static inline EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs, bool fTry = false) {}
|
||||||
void static inline LeaveCritical() {}
|
void static inline LeaveCritical() {}
|
||||||
void static inline CheckLastCritical(void* cs, std::string& lockname, const char* guardname, const char* file, int line) {}
|
void static inline CheckLastCritical(void* cs, std::string& lockname, const char* guardname, const char* file, int line) {}
|
||||||
void static inline AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs) ASSERT_EXCLUSIVE_LOCK(cs) {}
|
template <typename MutexType>
|
||||||
|
void static inline AssertLockHeldInternal(const char* pszName, const char* pszFile, int nLine, MutexType* cs) ASSERT_EXCLUSIVE_LOCK(cs) {}
|
||||||
void static inline AssertLockNotHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs) {}
|
void static inline AssertLockNotHeldInternal(const char* pszName, const char* pszFile, int nLine, void* cs) {}
|
||||||
void static inline DeleteLock(void* cs) {}
|
void static inline DeleteLock(void* cs) {}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -56,13 +56,19 @@
|
||||||
#define ASSERT_EXCLUSIVE_LOCK(...)
|
#define ASSERT_EXCLUSIVE_LOCK(...)
|
||||||
#endif // __GNUC__
|
#endif // __GNUC__
|
||||||
|
|
||||||
// LockGuard provides an annotated version of lock_guard for us
|
// StdMutex provides an annotated version of std::mutex for us,
|
||||||
// should only be used when sync.h Mutex/LOCK/etc aren't usable
|
// and should only be used when sync.h Mutex/LOCK/etc are not usable.
|
||||||
class SCOPED_LOCKABLE LockGuard : public std::lock_guard<std::mutex>
|
class LOCKABLE StdMutex : public std::mutex
|
||||||
|
{
|
||||||
|
};
|
||||||
|
|
||||||
|
// StdLockGuard provides an annotated version of std::lock_guard for us,
|
||||||
|
// and should only be used when sync.h Mutex/LOCK/etc are not usable.
|
||||||
|
class SCOPED_LOCKABLE StdLockGuard : public std::lock_guard<StdMutex>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit LockGuard(std::mutex& cs) EXCLUSIVE_LOCK_FUNCTION(cs) : std::lock_guard<std::mutex>(cs) { }
|
explicit StdLockGuard(StdMutex& cs) EXCLUSIVE_LOCK_FUNCTION(cs) : std::lock_guard<StdMutex>(cs) {}
|
||||||
~LockGuard() UNLOCK_FUNCTION() {};
|
~StdLockGuard() UNLOCK_FUNCTION() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // BITCOIN_THREADSAFETY_H
|
#endif // BITCOIN_THREADSAFETY_H
|
||||||
|
|
|
@ -746,7 +746,7 @@ UniValue dumpwallet(const JSONRPCRequest& request)
|
||||||
// the user could have gotten from another RPC command prior to now
|
// the user could have gotten from another RPC command prior to now
|
||||||
wallet.BlockUntilSyncedToCurrentChain();
|
wallet.BlockUntilSyncedToCurrentChain();
|
||||||
|
|
||||||
LOCK2(pwallet->cs_wallet, spk_man.cs_KeyStore);
|
LOCK2(wallet.cs_wallet, spk_man.cs_KeyStore);
|
||||||
|
|
||||||
EnsureWalletIsUnlocked(&wallet);
|
EnsureWalletIsUnlocked(&wallet);
|
||||||
|
|
||||||
|
@ -769,7 +769,7 @@ UniValue dumpwallet(const JSONRPCRequest& request)
|
||||||
|
|
||||||
std::map<CKeyID, int64_t> mapKeyBirth;
|
std::map<CKeyID, int64_t> mapKeyBirth;
|
||||||
const std::map<CKeyID, int64_t>& mapKeyPool = spk_man.GetAllReserveKeys();
|
const std::map<CKeyID, int64_t>& mapKeyPool = spk_man.GetAllReserveKeys();
|
||||||
pwallet->GetKeyBirthTimes(mapKeyBirth);
|
wallet.GetKeyBirthTimes(mapKeyBirth);
|
||||||
|
|
||||||
std::set<CScriptID> scripts = spk_man.GetCScripts();
|
std::set<CScriptID> scripts = spk_man.GetCScripts();
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue