From 7fa7dc36fed383098cd20f2bb94480e9562f17cf Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Sat, 7 May 2016 00:54:56 +0000 Subject: Take the API lock in SBThread::IsValid & SBFrame::IsValid. The IsValid calls can try to reconstruct the thread & frame, which can take various internal locks. This can cause A/B locking issues with the Target lock, so these calls need to that the Target lock. llvm-svn: 268828 --- lldb/source/API/SBThread.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'lldb/source/API/SBThread.cpp') diff --git a/lldb/source/API/SBThread.cpp b/lldb/source/API/SBThread.cpp index 43fb96d6677d..1fc0fdc5075e 100644 --- a/lldb/source/API/SBThread.cpp +++ b/lldb/source/API/SBThread.cpp @@ -130,7 +130,19 @@ SBThread::GetQueue () const bool SBThread::IsValid() const { - return m_opaque_sp->GetThreadSP().get() != NULL; + Mutex::Locker api_locker; + ExecutionContext exe_ctx (m_opaque_sp.get(), api_locker); + + Target *target = exe_ctx.GetTargetPtr(); + Process *process = exe_ctx.GetProcessPtr(); + if (target && process) + { + Process::StopLocker stop_locker; + if (stop_locker.TryLock(&process->GetRunLock())) + return m_opaque_sp->GetThreadSP().get() != NULL; + } + // Without a valid target & process, this thread can't be valid. + return false; } void -- cgit v1.2.3