Have LinuxThread cache it's current StopInfo object.
git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@123495 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Plugins/Process/Linux/LinuxThread.cpp b/source/Plugins/Process/Linux/LinuxThread.cpp
index e189064..caed8e1 100644
--- a/source/Plugins/Process/Linux/LinuxThread.cpp
+++ b/source/Plugins/Process/Linux/LinuxThread.cpp
@@ -26,6 +26,7 @@
LinuxThread::LinuxThread(Process &process, lldb::tid_t tid)
: Thread(process, tid),
m_frame_ap(0),
+ m_stop_info_id(0),
m_note(eNone)
{
}
@@ -40,6 +41,7 @@
void
LinuxThread::RefreshStateAfterStop()
{
+ RefreshPrivateStopReason();
}
const char *
@@ -101,24 +103,11 @@
lldb::StopInfoSP
LinuxThread::GetPrivateStopReason()
{
- lldb::StopInfoSP stop_info;
+ const uint32_t process_stop_id = GetProcess().GetStopID();
- switch (m_note)
- {
- default:
- break;
-
- case eBreak:
- stop_info = StopInfo::CreateStopReasonWithBreakpointSiteID(
- *this, m_breakpoint->GetID());
- break;
-
- case eTrace:
- stop_info = StopInfo::CreateStopReasonToTrace(*this);
- break;
- }
-
- return stop_info;
+ if (m_stop_info_id != process_stop_id || !m_stop_info || !m_stop_info->IsValid())
+ RefreshPrivateStopReason();
+ return m_stop_info;
}
Unwind *
@@ -196,3 +185,30 @@
{
m_note = eExit;
}
+
+void
+LinuxThread::RefreshPrivateStopReason()
+{
+ m_stop_info_id = GetProcess().GetStopID();
+
+ switch (m_note) {
+
+ default:
+ case eNone:
+ m_stop_info.reset();
+ break;
+
+ case eBreak:
+ m_stop_info = StopInfo::CreateStopReasonWithBreakpointSiteID(
+ *this, m_breakpoint->GetID());
+ break;
+
+ case eTrace:
+ m_stop_info = StopInfo::CreateStopReasonToTrace(*this);
+ break;
+
+ case eExit:
+ m_stop_info = StopInfo::CreateStopReasonWithSignal(*this, SIGCHLD);
+ break;
+ }
+}