Don't cache the public stop reason, since it can change as plan completion gets processed. That means GetStopReason needs to return a shared pointer, not a pointer to the thread's cached version. Also allow the thread plans to get and set the thread private stop reason - that is usually more appropriate for the logic the thread plans need to do.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@116892 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Target/Thread.cpp b/source/Target/Thread.cpp
index 60eef83..2df4e8f 100644
--- a/source/Target/Thread.cpp
+++ b/source/Target/Thread.cpp
@@ -44,14 +44,12 @@
UserID (tid),
ThreadInstanceSettings (*(Thread::GetSettingsController().get())),
m_process (process),
- m_public_stop_info_sp (),
m_actual_stop_info_sp (),
m_index_id (process.GetNextThreadIndexID ()),
m_reg_context_sp (),
m_state (eStateUnloaded),
m_state_mutex (Mutex::eMutexTypeRecursive),
m_plan_stack (),
- m_immediate_plan_stack(),
m_completed_plan_stack(),
m_curr_frames_ap (),
m_resume_signal (LLDB_INVALID_SIGNAL_NUMBER),
@@ -99,18 +97,14 @@
m_resume_state = state;
}
-StopInfo *
+lldb::StopInfoSP
Thread::GetStopInfo ()
{
- if (m_public_stop_info_sp.get() == NULL)
- {
- ThreadPlanSP plan_sp (GetCompletedPlan());
- if (plan_sp)
- m_public_stop_info_sp = StopInfo::CreateStopReasonWithPlan (plan_sp);
- else
- m_public_stop_info_sp = GetPrivateStopReason ();
- }
- return m_public_stop_info_sp.get();
+ ThreadPlanSP plan_sp (GetCompletedPlan());
+ if (plan_sp)
+ return StopInfo::CreateStopReasonWithPlan (plan_sp);
+ else
+ return GetPrivateStopReason ();
}
bool
@@ -210,7 +204,6 @@
plan_ptr->WillResume (resume_state, false);
}
- m_public_stop_info_sp.reset();
m_actual_stop_info_sp.reset();
return true;
}
@@ -353,10 +346,7 @@
{
if (thread_plan_sp)
{
- if (thread_plan_sp->IsImmediate())
- m_immediate_plan_stack.push_back (thread_plan_sp);
- else
- m_plan_stack.push_back (thread_plan_sp);
+ m_plan_stack.push_back (thread_plan_sp);
thread_plan_sp->DidPush();
@@ -365,10 +355,9 @@
{
StreamString s;
thread_plan_sp->GetDescription (&s, lldb::eDescriptionLevelFull);
- log->Printf("Pushing plan: \"%s\", tid = 0x%4.4x, immediate = %s.",
+ log->Printf("Pushing plan: \"%s\", tid = 0x%4.4x.",
s.GetData(),
- thread_plan_sp->GetThread().GetID(),
- thread_plan_sp->IsImmediate() ? "true" : "false");
+ thread_plan_sp->GetThread().GetID());
}
}
}
@@ -378,17 +367,7 @@
{
Log *log = lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_STEP);
- if (!m_immediate_plan_stack.empty())
- {
- ThreadPlanSP &plan = m_immediate_plan_stack.back();
- if (log)
- {
- log->Printf("Popping plan: \"%s\", tid = 0x%4.4x, immediate = true.", plan->GetName(), plan->GetThread().GetID());
- }
- plan->WillPop();
- m_immediate_plan_stack.pop_back();
- }
- else if (m_plan_stack.empty())
+ if (m_plan_stack.empty())
return;
else
{
@@ -418,9 +397,7 @@
ThreadPlan *
Thread::GetCurrentPlan ()
{
- if (!m_immediate_plan_stack.empty())
- return m_immediate_plan_stack.back().get();
- else if (m_plan_stack.empty())
+ if (m_plan_stack.empty())
return NULL;
else
return m_plan_stack.back().get();
@@ -488,22 +465,6 @@
if (stack_size > 0 && m_completed_plan_stack[0].get() == current_plan)
{
- if (m_immediate_plan_stack.size() > 0)
- return m_immediate_plan_stack.back().get();
- else if (m_plan_stack.size() > 0)
- return m_plan_stack.back().get();
- else
- return NULL;
- }
-
- stack_size = m_immediate_plan_stack.size();
- for (int i = stack_size - 1; i > 0; i--)
- {
- if (current_plan == m_immediate_plan_stack[i].get())
- return m_immediate_plan_stack[i-1].get();
- }
- if (stack_size > 0 && m_immediate_plan_stack[0].get() == current_plan)
- {
if (m_plan_stack.size() > 0)
return m_plan_stack.back().get();
else
@@ -751,17 +712,6 @@
s->EOL();
}
- stack_size = m_immediate_plan_stack.size();
- s->Printf ("Immediate Plan Stack: %d elements.\n", stack_size);
- for (i = stack_size - 1; i >= 0; i--)
- {
- s->Printf ("Element %d: ", i);
- s->IndentMore();
- m_immediate_plan_stack[i]->GetDescription (s, eDescriptionLevelFull);
- s->IndentLess();
- s->EOL();
- }
-
stack_size = m_completed_plan_stack.size();
s->Printf ("Completed Plan Stack: %d elements.\n", stack_size);
for (i = stack_size - 1; i >= 0; i--)