mirror of
https://github.com/dashpay/dash.git
synced 2024-12-28 13:32:47 +01:00
25bdc2670e
e1e68b6305beb47ebf7ee48f14e12fdebdfea1ef test: Fix inconsistent lock order in wallet_tests/CreateWallet (Hennadii Stepanov) cb23fe01c125e1820f3c37348e06d98c93e6aec2 sync: Check precondition in LEAVE_CRITICAL_SECTION() macro (Hennadii Stepanov) c5e3e74f70c29ac8852903ef425f5f327d5da969 sync: Improve CheckLastCritical() (Hennadii Stepanov) Pull request description: This PR: - fixes #19049 that was caused by #16426 - removes `wallet_tests::CreateWallet` suppression from the `test/sanitizer_suppressions/tsan` The example of the improved `CheckLastCritical()`/`LEAVE_CRITICAL_SECTION()` log (could be got when compiled without the last commit): ``` 2020-09-20T08:34:28.429485Z [test] INCONSISTENT LOCK ORDER DETECTED 2020-09-20T08:34:28.429493Z [test] Current lock order (least recent first) is: 2020-09-20T08:34:28.429501Z [test] 'walletInstance->cs_wallet' in wallet/wallet.cpp:4007 (in thread 'test') 2020-09-20T08:34:28.429508Z [test] 'cs_wallets' in wallet/wallet.cpp:4089 (in thread 'test') ``` Currently, there are other "naked" `LEAVE_CRITICAL_SECTION()` in the code base:b99a1633b2/src/rpc/mining.cpp (L698)
b99a1633b2/src/checkqueue.h (L208)
ACKs for top commit: MarcoFalke: review ACK e1e68b6305beb47ebf7ee48f14e12fdebdfea1ef 💂 ryanofsky: Code review ACK e1e68b6305beb47ebf7ee48f14e12fdebdfea1ef. Just trivial rebase and suggested switch to BOOST_CHECK_EXCEPTION since last review vasild: ACK e1e68b630 Tree-SHA512: a627680eac3af4b4c02772473d68322ce8d3811bf6b035d3485ccc97d35755bef933cffabd3f20b126f89e3301eccecec3f769df34415fb7c426c967b6ce36e6
92 lines
2.2 KiB
C++
92 lines
2.2 KiB
C++
// Copyright (c) 2015 The Bitcoin Core developers
|
|
// Distributed under the MIT software license, see the accompanying
|
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
|
|
|
#include <sync.h>
|
|
#include <test/util/setup_common.h>
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
BOOST_FIXTURE_TEST_SUITE(reverselock_tests, BasicTestingSetup)
|
|
|
|
BOOST_AUTO_TEST_CASE(reverselock_basics)
|
|
{
|
|
Mutex mutex;
|
|
WAIT_LOCK(mutex, lock);
|
|
|
|
BOOST_CHECK(lock.owns_lock());
|
|
{
|
|
REVERSE_LOCK(lock);
|
|
BOOST_CHECK(!lock.owns_lock());
|
|
}
|
|
BOOST_CHECK(lock.owns_lock());
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(reverselock_multiple)
|
|
{
|
|
Mutex mutex2;
|
|
Mutex mutex;
|
|
WAIT_LOCK(mutex2, lock2);
|
|
WAIT_LOCK(mutex, lock);
|
|
|
|
// Make sure undoing two locks succeeds
|
|
{
|
|
REVERSE_LOCK(lock);
|
|
BOOST_CHECK(!lock.owns_lock());
|
|
REVERSE_LOCK(lock2);
|
|
BOOST_CHECK(!lock2.owns_lock());
|
|
}
|
|
BOOST_CHECK(lock.owns_lock());
|
|
BOOST_CHECK(lock2.owns_lock());
|
|
}
|
|
|
|
BOOST_AUTO_TEST_CASE(reverselock_errors)
|
|
{
|
|
Mutex mutex2;
|
|
Mutex mutex;
|
|
WAIT_LOCK(mutex2, lock2);
|
|
WAIT_LOCK(mutex, lock);
|
|
|
|
#ifdef DEBUG_LOCKORDER
|
|
bool prev = g_debug_lockorder_abort;
|
|
g_debug_lockorder_abort = false;
|
|
|
|
// Make sure trying to reverse lock a previous lock fails
|
|
BOOST_CHECK_EXCEPTION(REVERSE_LOCK(lock2), std::logic_error, HasReason("lock2 was not most recent critical section locked"));
|
|
BOOST_CHECK(lock2.owns_lock());
|
|
|
|
g_debug_lockorder_abort = prev;
|
|
#endif
|
|
|
|
// Make sure trying to reverse lock an unlocked lock fails
|
|
lock.unlock();
|
|
|
|
BOOST_CHECK(!lock.owns_lock());
|
|
|
|
bool failed = false;
|
|
try {
|
|
REVERSE_LOCK(lock);
|
|
} catch(...) {
|
|
failed = true;
|
|
}
|
|
|
|
BOOST_CHECK(failed);
|
|
BOOST_CHECK(!lock.owns_lock());
|
|
|
|
// Locking the original lock after it has been taken by a reverse lock
|
|
// makes no sense. Ensure that the original lock no longer owns the lock
|
|
// after giving it to a reverse one.
|
|
|
|
lock.lock();
|
|
BOOST_CHECK(lock.owns_lock());
|
|
{
|
|
REVERSE_LOCK(lock);
|
|
BOOST_CHECK(!lock.owns_lock());
|
|
}
|
|
|
|
BOOST_CHECK(failed);
|
|
BOOST_CHECK(lock.owns_lock());
|
|
}
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|