merge bitcoin#19353: Fix mistakenly swapped "previous" and "current" lock orders

This commit is contained in:
Kittywhiskers Van Gogh 2020-06-22 18:12:26 +03:00 committed by Pasta
parent 790a4f9d60
commit 2b48a6d6a2
No known key found for this signature in database
GPG Key ID: 52527BEDABE87984
2 changed files with 18 additions and 14 deletions

View File

@ -62,7 +62,7 @@ struct CLockLocation {
std::string ToString() const
{
return tfm::format(
"%s %s:%s%s (in thread %s)",
"'%s' in %s:%s%s (in thread '%s')",
mutexName, sourceFile, itostr(sourceLine), (fTry ? " (TRY)" : ""), m_thread_name);
}
@ -108,16 +108,6 @@ static void potential_deadlock_detected(const LockPair& mismatch, const LockStac
std::string strOutput = "";
strOutput += "POTENTIAL DEADLOCK DETECTED\n";
strOutput += "Previous lock order was:\n";
for (const LockStackItem& i : s2) {
if (i.first == mismatch.first) {
strOutput += " (1)";
}
if (i.first == mismatch.second) {
strOutput += " (2)";
}
strOutput += strprintf(" %s\n", i.second.ToString().c_str());
}
strOutput += "Current lock order is:\n";
for (const LockStackItem& i : s1) {
if (i.first == mismatch.first) {
strOutput += " (1)";
@ -128,14 +118,28 @@ static void potential_deadlock_detected(const LockPair& mismatch, const LockStac
strOutput += strprintf(" %s\n", i.second.ToString().c_str());
}
std::string mutex_a, mutex_b;
strOutput += "Current lock order is:\n";
for (const LockStackItem& i : s2) {
if (i.first == mismatch.first) {
strOutput += " (1)";
mutex_a = i.second.Name();
}
if (i.first == mismatch.second) {
strOutput += " (2)";
mutex_b = i.second.Name();
}
strOutput += strprintf(" %s\n", i.second.ToString().c_str());
}
printf("%s\n", strOutput.c_str());
LogPrintf("%s\n", strOutput.c_str());
if (g_debug_lockorder_abort) {
fprintf(stderr, "Assertion failed: detected inconsistent lock order at %s:%i, details in debug log.\n", __FILE__, __LINE__);
fprintf(stderr, "Assertion failed: detected inconsistent lock order for %s, details in debug log.\n", s2.back().second.ToString().c_str());
abort();
}
throw std::logic_error("potential deadlock detected");
throw std::logic_error(strprintf("potential deadlock detected: %s -> %s -> %s", mutex_b, mutex_a, mutex_b));
}
static void push_lock(void* c, const CLockLocation& locklocation)

View File

@ -19,7 +19,7 @@ void TestPotentialDeadLockDetected(MutexType& mutex1, MutexType& mutex2)
try {
LOCK2(mutex2, mutex1);
} catch (const std::logic_error& e) {
BOOST_CHECK_EQUAL(e.what(), "potential deadlock detected");
BOOST_CHECK_EQUAL(e.what(), "potential deadlock detected: mutex1 -> mutex2 -> mutex1");
error_thrown = true;
}
BOOST_CHECK(LockStackEmpty());