diff options
Diffstat (limited to 'lldb')
| -rw-r--r-- | lldb/include/lldb/Target/Thread.h | 4 | ||||
| -rw-r--r-- | lldb/include/lldb/Target/ThreadList.h | 3 | ||||
| -rw-r--r-- | lldb/source/Target/Process.cpp | 13 | ||||
| -rw-r--r-- | lldb/source/Target/Thread.cpp | 6 | ||||
| -rw-r--r-- | lldb/source/Target/ThreadList.cpp | 22 | ||||
| -rw-r--r-- | lldb/test/functionalities/thread/state/TestThreadStates.py | 2 |
6 files changed, 48 insertions, 2 deletions
diff --git a/lldb/include/lldb/Target/Thread.h b/lldb/include/lldb/Target/Thread.h index f1f8439e2a4..1856d63d5ff 100644 --- a/lldb/include/lldb/Target/Thread.h +++ b/lldb/include/lldb/Target/Thread.h @@ -277,6 +277,10 @@ public: virtual void DidResume (); + // This notifies the thread when a private stop occurs. + virtual void + DidStop (); + virtual void RefreshStateAfterStop() = 0; diff --git a/lldb/include/lldb/Target/ThreadList.h b/lldb/include/lldb/Target/ThreadList.h index 959091c81bf..ddf49b002ec 100644 --- a/lldb/include/lldb/Target/ThreadList.h +++ b/lldb/include/lldb/Target/ThreadList.h @@ -120,6 +120,9 @@ public: DidResume (); void + DidStop (); + + void DiscardThreadPlans(); uint32_t diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 93fd93a71de..f6fdca8a425 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -1722,6 +1722,19 @@ Process::SetPrivateState (StateType new_state) m_private_state.SetValueNoLock (new_state); if (StateIsStoppedState(new_state, false)) { + // Note, this currently assumes that all threads in the list + // stop when the process stops. In the future we will want to + // support a debugging model where some threads continue to run + // while others are stopped. When that happens we will either need + // a way for the thread list to identify which threads are stopping + // or create a special thread list containing only threads which + // actually stopped. + // + // The process plugin is responsible for managing the actual + // behavior of the threads and should have stopped any threads + // that are going to stop before we get here. + m_thread_list.DidStop(); + m_mod_id.BumpStopID(); m_memory_cache.Clear(); if (log) diff --git a/lldb/source/Target/Thread.cpp b/lldb/source/Target/Thread.cpp index 23c75e3e9ac..478021ac367 100644 --- a/lldb/source/Target/Thread.cpp +++ b/lldb/source/Target/Thread.cpp @@ -610,6 +610,12 @@ Thread::DidResume () SetResumeSignal (LLDB_INVALID_SIGNAL_NUMBER); } +void +Thread::DidStop () +{ + SetState (eStateStopped); +} + bool Thread::ShouldStop (Event* event_ptr) { diff --git a/lldb/source/Target/ThreadList.cpp b/lldb/source/Target/ThreadList.cpp index 4971d6c963f..8db2b40d292 100644 --- a/lldb/source/Target/ThreadList.cpp +++ b/lldb/source/Target/ThreadList.cpp @@ -11,6 +11,7 @@ #include <algorithm> #include "lldb/Core/Log.h" +#include "lldb/Core/State.h" #include "lldb/Target/RegisterContext.h" #include "lldb/Target/ThreadList.h" #include "lldb/Target/Thread.h" @@ -648,6 +649,27 @@ ThreadList::DidResume () } } +void +ThreadList::DidStop () +{ + Mutex::Locker locker(GetMutex()); + collection::iterator pos, end = m_threads.end(); + for (pos = m_threads.begin(); pos != end; ++pos) + { + // Notify threads that the process just stopped. + // Note, this currently assumes that all threads in the list + // stop when the process stops. In the future we will want to support + // a debugging model where some threads continue to run while others + // are stopped. We either need to handle that somehow here or + // create a special thread list containing only threads which will + // stop in the code that calls this method (currently + // Process::SetPrivateState). + ThreadSP thread_sp(*pos); + if (StateIsRunningState(thread_sp->GetState())) + thread_sp->DidStop (); + } +} + ThreadSP ThreadList::GetSelectedThread () { diff --git a/lldb/test/functionalities/thread/state/TestThreadStates.py b/lldb/test/functionalities/thread/state/TestThreadStates.py index 7e59b22aaee..185eb50106a 100644 --- a/lldb/test/functionalities/thread/state/TestThreadStates.py +++ b/lldb/test/functionalities/thread/state/TestThreadStates.py @@ -14,14 +14,12 @@ class StopThreadsTestCase(TestBase): @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") @dsym_test - @unittest2.expectedFailure("PR-15824") # thread states not properly maintained def test_state_after_breakpoint_with_dsym(self): """Test thread state after breakpoint.""" self.buildDsym() self.thread_state_after_breakpoint_test() @dwarf_test - @unittest2.expectedFailure("PR-15824") # thread states not properly maintained def test_state_after_breakpoint_with_dwarf(self): """Test thread state after breakpoint.""" self.buildDwarf() |

