summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2012-04-04 20:43:47 +0000
committerGreg Clayton <gclayton@apple.com>2012-04-04 20:43:47 +0000
commit0b88d815e33a033ae0e76ddba347a49b352c2df5 (patch)
treed739dc90deb0181506599426f29dd37f9012ba5a
parent747ff7e1940142eaf2e5c4515fe1a14af9e1ac64 (diff)
downloadbcm5719-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.h9
-rw-r--r--lldb/source/Target/ExecutionContext.cpp16
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;
OpenPOWER on IntegriCloud