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;
+    }
+}