Adding support for stopping all threads of multithreaded inferiors on Linux. Also adding multithreaded test cases.
llvm-svn: 182809
diff --git a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp
index 5d93502..8c0a2a2 100644
--- a/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp
+++ b/lldb/source/Plugins/Process/Linux/ProcessLinux.cpp
@@ -64,7 +64,7 @@
// Constructors and destructors.
ProcessLinux::ProcessLinux(Target& target, Listener &listener)
- : ProcessPOSIX(target, listener)
+ : ProcessPOSIX(target, listener), m_stopping_threads(false)
{
#if 0
// FIXME: Putting this code in the ctor and saving the byte order in a
@@ -134,3 +134,39 @@
{
return NULL;
}
+
+// ProcessPOSIX override
+void
+ProcessLinux::StopAllThreads(lldb::tid_t stop_tid)
+{
+ // If a breakpoint occurs while we're stopping threads, we'll get back
+ // here, but we don't want to do it again. Only the MonitorChildProcess
+ // thread calls this function, so we don't need to protect this flag.
+ if (m_stopping_threads)
+ return;
+ m_stopping_threads = true;
+
+ Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
+ if (log)
+ log->Printf ("ProcessLinux::%s() stopping all threads", __FUNCTION__);
+
+ // Walk the thread list and stop the other threads. The thread that caused
+ // the stop should already be marked as stopped before we get here.
+ Mutex::Locker thread_list_lock(m_thread_list.GetMutex());
+
+ uint32_t thread_count = m_thread_list.GetSize(false);
+ for (uint32_t i = 0; i < thread_count; ++i)
+ {
+ POSIXThread *thread = static_cast<POSIXThread*>(
+ m_thread_list.GetThreadAtIndex(i, false).get());
+ assert(thread);
+ lldb::tid_t tid = thread->GetID();
+ if (!StateIsStoppedState(thread->GetState(), false))
+ m_monitor->StopThread(tid);
+ }
+
+ m_stopping_threads = false;
+
+ if (log)
+ log->Printf ("ProcessLinux::%s() finished", __FUNCTION__);
+}