<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
This commit is contained in:
Greg Clayton 2012-04-04 20:43:47 +00:00
parent 747ff7e194
commit 0b88d815e3
2 changed files with 20 additions and 5 deletions

View File

@ -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;

View File

@ -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;