aboutsummaryrefslogtreecommitdiff
path: root/src/sync.cpp
diff options
context:
space:
mode:
authorMatt Corallo <git@bluematt.me>2017-02-02 22:22:01 -0500
committerMatt Corallo <git@bluematt.me>2017-02-02 22:31:27 -0500
commit8465631845eac3db834942a4feb50f65c3401c68 (patch)
treecdd5873fa56481570050a64ef6216cf5a880e5de /src/sync.cpp
parentfd13eca147be80f3ebd1a5a1db1ce75bbeeb1953 (diff)
downloadbitcoin-8465631845eac3db834942a4feb50f65c3401c68.tar.xz
Always enforce lock strict lock ordering (try or not)
Diffstat (limited to 'src/sync.cpp')
-rw-r--r--src/sync.cpp26
1 files changed, 1 insertions, 25 deletions
diff --git a/src/sync.cpp b/src/sync.cpp
index a18d0f1485..25773f08e9 100644
--- a/src/sync.cpp
+++ b/src/sync.cpp
@@ -77,52 +77,28 @@ boost::thread_specific_ptr<LockStack> lockstack;
static void potential_deadlock_detected(const std::pair<void*, void*>& mismatch, const LockStack& s1, const LockStack& s2)
{
- // We attempt to not assert on probably-not deadlocks by assuming that
- // a try lock will immediately have otherwise bailed if it had
- // failed to get the lock
- // We do this by, for the locks which triggered the potential deadlock,
- // in either lockorder, checking that the second of the two which is locked
- // is only a TRY_LOCK, ignoring locks if they are reentrant.
- bool firstLocked = false;
- bool secondLocked = false;
- bool onlyMaybeDeadlock = false;
-
LogPrintf("POTENTIAL DEADLOCK DETECTED\n");
LogPrintf("Previous lock order was:\n");
BOOST_FOREACH (const PAIRTYPE(void*, CLockLocation) & i, s2) {
if (i.first == mismatch.first) {
LogPrintf(" (1)");
- if (!firstLocked && secondLocked && i.second.fTry)
- onlyMaybeDeadlock = true;
- firstLocked = true;
}
if (i.first == mismatch.second) {
LogPrintf(" (2)");
- if (!secondLocked && firstLocked && i.second.fTry)
- onlyMaybeDeadlock = true;
- secondLocked = true;
}
LogPrintf(" %s\n", i.second.ToString());
}
- firstLocked = false;
- secondLocked = false;
LogPrintf("Current lock order is:\n");
BOOST_FOREACH (const PAIRTYPE(void*, CLockLocation) & i, s1) {
if (i.first == mismatch.first) {
LogPrintf(" (1)");
- if (!firstLocked && secondLocked && i.second.fTry)
- onlyMaybeDeadlock = true;
- firstLocked = true;
}
if (i.first == mismatch.second) {
LogPrintf(" (2)");
- if (!secondLocked && firstLocked && i.second.fTry)
- onlyMaybeDeadlock = true;
- secondLocked = true;
}
LogPrintf(" %s\n", i.second.ToString());
}
- assert(onlyMaybeDeadlock);
+ assert(false);
}
static void push_lock(void* c, const CLockLocation& locklocation, bool fTry)