diff options
| author | Jim Ingham <jingham@apple.com> | 2016-05-07 00:54:56 +0000 |
|---|---|---|
| committer | Jim Ingham <jingham@apple.com> | 2016-05-07 00:54:56 +0000 |
| commit | 7fa7dc36fed383098cd20f2bb94480e9562f17cf (patch) | |
| tree | 16badc4d34173f1f05d54f5ebf1cec9d248e6412 /lldb/source/API/SBThread.cpp | |
| parent | 8bbfdcd181cc1db80317dbd8762fb9e2d7f34e27 (diff) | |
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
Diffstat (limited to 'lldb/source/API/SBThread.cpp')
| -rw-r--r-- | lldb/source/API/SBThread.cpp | 14 |
1 files changed, 13 insertions, 1 deletions
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 |
