diff options
| author | Greg Clayton <gclayton@apple.com> | 2012-04-04 20:43:47 +0000 |
|---|---|---|
| committer | Greg Clayton <gclayton@apple.com> | 2012-04-04 20:43:47 +0000 |
| commit | 0b88d815e33a033ae0e76ddba347a49b352c2df5 (patch) | |
| tree | d739dc90deb0181506599426f29dd37f9012ba5a | |
| parent | 747ff7e1940142eaf2e5c4515fe1a14af9e1ac64 (diff) | |
| download | bcm5719-llvm-0b88d815e33a033ae0e76ddba347a49b352c2df5.tar.gz bcm5719-llvm-0b88d815e33a033ae0e76ddba347a49b352c2df5.zip | |
<rdar://problem/11184458>
Found an issue where we might still have shared pointer references to lldb_private::Thread objects where the object itself is not valid and has been removed from the Process. When a thread is removed from a process, it will call Thread::DestroyThread() which well set a boolean member variable which is exposed now via:
bool
Thread::IsValid() const;
We then check the thread validity before handing out a shared pointer.
llvm-svn: 154048
| -rw-r--r-- | lldb/include/lldb/Target/Thread.h | 9 | ||||
| -rw-r--r-- | lldb/source/Target/ExecutionContext.cpp | 16 |
2 files changed, 20 insertions, 5 deletions
diff --git a/lldb/include/lldb/Target/Thread.h b/lldb/include/lldb/Target/Thread.h index 172a9f224b8..7a11d027784 100644 --- a/lldb/include/lldb/Target/Thread.h +++ b/lldb/include/lldb/Target/Thread.h @@ -758,6 +758,15 @@ public: uint32_t source_lines_before, uint32_t source_lines_after); + // We need a way to verify that even though we have a thread in a shared + // pointer that the object itself is still valid. Currently this won't be + // the case if DestroyThread() was called. DestroyThread is called when + // a thread has been removed from the Process' thread list. + bool + IsValid () const + { + return m_destroy_called; + } protected: friend class ThreadPlan; diff --git a/lldb/source/Target/ExecutionContext.cpp b/lldb/source/Target/ExecutionContext.cpp index 3e0731d9c0e..2adfff0e86b 100644 --- a/lldb/source/Target/ExecutionContext.cpp +++ b/lldb/source/Target/ExecutionContext.cpp @@ -658,13 +658,19 @@ lldb::ThreadSP ExecutionContextRef::GetThreadSP () const { lldb::ThreadSP thread_sp (m_thread_wp.lock()); - if (!thread_sp && m_tid != LLDB_INVALID_THREAD_ID) + if (m_tid != LLDB_INVALID_THREAD_ID) { - lldb::ProcessSP process_sp(GetProcessSP()); - if (process_sp) + // We check if the thread has been destroyed in cases where clients + // might still have shared pointer to a thread, but the thread is + // not valid anymore (not part of the process) + if (!thread_sp || !thread_sp->IsValid()) { - thread_sp = process_sp->GetThreadList().FindThreadByID(m_tid); - m_thread_wp = thread_sp; + lldb::ProcessSP process_sp(GetProcessSP()); + if (process_sp) + { + thread_sp = process_sp->GetThreadList().FindThreadByID(m_tid); + m_thread_wp = thread_sp; + } } } return thread_sp; |

