aboutsummaryrefslogtreecommitdiff
path: root/src/sync.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sync.cpp')
-rw-r--r--src/sync.cpp21
1 files changed, 19 insertions, 2 deletions
diff --git a/src/sync.cpp b/src/sync.cpp
index 924e7b5bb..b86c57e49 100644
--- a/src/sync.cpp
+++ b/src/sync.cpp
@@ -13,9 +13,9 @@
#include <util/strencodings.h>
#include <util/threadnames.h>
-
#include <map>
#include <set>
+#include <system_error>
#ifdef DEBUG_LOCKCONTENTION
#if !defined(HAVE_THREAD_LOCAL)
@@ -57,7 +57,12 @@ struct CLockLocation {
{
return strprintf(
"%s %s:%s%s (in thread %s)",
- mutexName, sourceFile, itostr(sourceLine), (fTry ? " (TRY)" : ""), m_thread_name);
+ mutexName, sourceFile, sourceLine, (fTry ? " (TRY)" : ""), m_thread_name);
+ }
+
+ std::string Name() const
+ {
+ return mutexName;
}
private:
@@ -155,6 +160,18 @@ void EnterCritical(const char* pszName, const char* pszFile, int nLine, void* cs
push_lock(cs, CLockLocation(pszName, pszFile, nLine, fTry, util::ThreadGetInternalName()));
}
+void CheckLastCritical(void* cs, std::string& lockname, const char* guardname, const char* file, int line)
+{
+ if (!g_lockstack.empty()) {
+ const auto& lastlock = g_lockstack.back();
+ if (lastlock.first == cs) {
+ lockname = lastlock.second.Name();
+ return;
+ }
+ }
+ throw std::system_error(EPERM, std::generic_category(), strprintf("%s:%s %s was not most recent critical section locked", file, line, guardname));
+}
+
void LeaveCritical()
{
pop_lock();