diff options
Diffstat (limited to 'src/sync.cpp')
| -rw-r--r-- | src/sync.cpp | 21 |
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(); |