forked from OSchip/llvm-project
<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:
parent
747ff7e194
commit
0b88d815e3
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in New Issue