Merge #20507: sync: print proper lock order location when double lock is detected

db058efeb0 sync: use HasReason() in double lock tests (Vasil Dimov)
a21dc469cc sync: const-qualify the argument of double_lock_detected() (Vasil Dimov)
6d3689fcf6 sync: print proper lock order location when double lock is detected (Vasil Dimov)

Pull request description:

  Before:
  ```
  Assertion failed: detected double lock at src/sync.cpp:153, details in debug log.
  ```

  After:
  ```
  Assertion failed: detected double lock for 'm' in src/test/sync_tests.cpp:40 (in thread ''), details in debug log.
  ```

ACKs for top commit:
  jonasschnelli:
    utACK db058efeb0
  ajtowns:
    ACK db058efeb0
  hebasto:
    ACK db058efeb0, tested on Linux Mint 20 (x86_64).

Tree-SHA512: 452ddb9a14e44bb174135b39f2219c76eadbb8a6c0e80d64a25f995780d6dbc7b570d9902616db94dbfabaee197b5828ba3475171a68240ac0958fb203a7acdb
pull/679/head
MarcoFalke 4 years ago
commit 7f0f01f0ab
No known key found for this signature in database
GPG Key ID: D2EA4850E7528B25

@ -139,7 +139,7 @@ static void potential_deadlock_detected(const LockPair& mismatch, const LockStac
throw std::logic_error(strprintf("potential deadlock detected: %s -> %s -> %s", mutex_b, mutex_a, mutex_b)); throw std::logic_error(strprintf("potential deadlock detected: %s -> %s -> %s", mutex_b, mutex_a, mutex_b));
} }
static void double_lock_detected(const void* mutex, LockStack& lock_stack) static void double_lock_detected(const void* mutex, const LockStack& lock_stack)
{ {
LogPrintf("DOUBLE LOCK DETECTED\n"); LogPrintf("DOUBLE LOCK DETECTED\n");
LogPrintf("Lock order:\n"); LogPrintf("Lock order:\n");
@ -150,7 +150,9 @@ static void double_lock_detected(const void* mutex, LockStack& lock_stack)
LogPrintf(" %s\n", i.second.ToString()); LogPrintf(" %s\n", i.second.ToString());
} }
if (g_debug_lockorder_abort) { if (g_debug_lockorder_abort) {
tfm::format(std::cerr, "Assertion failed: detected double lock at %s:%i, details in debug log.\n", __FILE__, __LINE__); tfm::format(std::cerr,
"Assertion failed: detected double lock for %s, details in debug log.\n",
lock_stack.back().second.ToString());
abort(); abort();
} }
throw std::logic_error("double lock detected"); throw std::logic_error("double lock detected");

@ -50,10 +50,8 @@ void TestDoubleLock(bool should_throw)
MutexType m; MutexType m;
ENTER_CRITICAL_SECTION(m); ENTER_CRITICAL_SECTION(m);
if (should_throw) { if (should_throw) {
BOOST_CHECK_EXCEPTION( BOOST_CHECK_EXCEPTION(TestDoubleLock2(m), std::logic_error,
TestDoubleLock2(m), std::logic_error, [](const std::logic_error& e) { HasReason("double lock detected"));
return strcmp(e.what(), "double lock detected") == 0;
});
} else { } else {
BOOST_CHECK_NO_THROW(TestDoubleLock2(m)); BOOST_CHECK_NO_THROW(TestDoubleLock2(m));
} }

Loading…
Cancel
Save