summaryrefslogtreecommitdiffstats
path: root/lldb/source/Target/ThreadList.cpp
diff options
context:
space:
mode:
authorGreg Clayton <gclayton@apple.com>2013-05-09 01:55:29 +0000
committerGreg Clayton <gclayton@apple.com>2013-05-09 01:55:29 +0000
commit6e0ff1a3cb5a1719c12ce156c4297d724c20b955 (patch)
tree2ea43845a7393dc9bb2df095f72b25a3393ca914 /lldb/source/Target/ThreadList.cpp
parent083fcdb41448362b803c47fe85dfeb830d25220c (diff)
downloadbcm5719-llvm-6e0ff1a3cb5a1719c12ce156c4297d724c20b955.tar.gz
bcm5719-llvm-6e0ff1a3cb5a1719c12ce156c4297d724c20b955.zip
Changed the formerly pure virtual function:
namespace lldb_private { class Thread { virtual lldb::StopInfoSP GetPrivateStopReason() = 0; }; } To not be virtual. The lldb_private::Thread now handles the correct caching and will call a new pure virtual function: namespace lldb_private { class Thread { virtual bool CalculateStopInfo() = 0; } } This function must be overridden by thead lldb_private::Thread subclass and the only thing it needs to do is to set the Thread::StopInfo() with the current stop reason and return true, or return false if there is no stop reason. The lldb_private::Thread class will take care of calling this function only when it is required. This allows lldb_private::Thread subclasses to be a bit simpler and not all need to duplicate the cache and invalidation settings. Also renamed: lldb::StopInfoSP lldb_private::Thread::GetPrivateStopReason(); To: lldb::StopInfoSP lldb_private::Thread::GetPrivateStopInfo(); Also cleaned up a case where the ThreadPlanStepOverBreakpoint might not re-set its breakpoint if the thread disappears (which was happening due to a bug when using the OperatingSystem plug-ins with memory threads and real threads). llvm-svn: 181501
Diffstat (limited to 'lldb/source/Target/ThreadList.cpp')
-rw-r--r--lldb/source/Target/ThreadList.cpp21
1 files changed, 8 insertions, 13 deletions
diff --git a/lldb/source/Target/ThreadList.cpp b/lldb/source/Target/ThreadList.cpp
index 8db2b40d292..1f8b351100a 100644
--- a/lldb/source/Target/ThreadList.cpp
+++ b/lldb/source/Target/ThreadList.cpp
@@ -505,6 +505,8 @@ ThreadList::WillResume ()
if ((*pos)->GetResumeState() != eStateSuspended &&
(*pos)->GetCurrentPlan()->StopOthers())
{
+ if ((*pos)->IsOperatingSystemPluginThread() && !(*pos)->GetBackingThread())
+ continue;
wants_solo_run = true;
break;
}
@@ -535,6 +537,8 @@ ThreadList::WillResume ()
if ((*pos)->GetResumeState() != eStateSuspended
&& (!wants_solo_run || (*pos)->GetCurrentPlan()->StopOthers()))
{
+ if ((*pos)->IsOperatingSystemPluginThread() && !(*pos)->GetBackingThread())
+ continue;
(*pos)->SetupForResume ();
}
}
@@ -546,7 +550,6 @@ ThreadList::WillResume ()
run_me_only_list.SetStopID(m_process->GetStopID());
- ThreadSP immediate_thread_sp;
bool run_only_current_thread = false;
for (pos = m_threads.begin(); pos != end; ++pos)
@@ -555,6 +558,9 @@ ThreadList::WillResume ()
if (thread_sp->GetResumeState() != eStateSuspended &&
thread_sp->GetCurrentPlan()->StopOthers())
{
+ if ((*pos)->IsOperatingSystemPluginThread() && !(*pos)->GetBackingThread())
+ continue;
+
// You can't say "stop others" and also want yourself to be suspended.
assert (thread_sp->GetCurrentPlan()->RunState() != eStateSuspended);
@@ -573,18 +579,7 @@ ThreadList::WillResume ()
bool need_to_resume = true;
- if (immediate_thread_sp)
- {
- for (pos = m_threads.begin(); pos != end; ++pos)
- {
- ThreadSP thread_sp(*pos);
- if (thread_sp.get() == immediate_thread_sp.get())
- thread_sp->ShouldResume(thread_sp->GetCurrentPlan()->RunState());
- else
- thread_sp->ShouldResume (eStateSuspended);
- }
- }
- else if (run_me_only_list.GetSize (false) == 0)
+ if (run_me_only_list.GetSize (false) == 0)
{
// Everybody runs as they wish:
for (pos = m_threads.begin(); pos != end; ++pos)
OpenPOWER on IntegriCloud