From 743ecf43930d62ba55f58bd30f82ba7de502c0c3 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Tue, 16 Oct 2012 20:20:18 +0000 Subject: [PATCH] Patch from Matt Kopec: This patch fixes an issue where if lldb fails to attach to a process (ie. invalid pid) on Linux, the process monitor thread gets stuck waiting for a signal from the attach thread, which never comes due to not being signaled. It also implements StopOpThread which is used for both attach/launch cases as I'm not aware of any special handling needed for the attach case. Also, propagate 'Error' from the Detach function instead of using a bool. llvm-svn: 166055 --- .../Plugins/Process/Linux/ProcessMonitor.cpp | 54 ++++++++++------------ lldb/source/Plugins/Process/Linux/ProcessMonitor.h | 12 ++--- 2 files changed, 30 insertions(+), 36 deletions(-) diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp index 4daccee..46ea84b 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp +++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp @@ -843,7 +843,7 @@ WAIT_AGAIN: // Check that the launch was a success. if (!args->m_error.Success()) { - StopLaunchOpThread(); + StopOpThread(); error = args->m_error; return; } @@ -898,10 +898,10 @@ WAIT_AGAIN: } } - // Check that the launch was a success. + // Check that the attach was a success. if (!args->m_error.Success()) { - StopAttachOpThread(); + StopOpThread(); error = args->m_error; return; } @@ -936,18 +936,6 @@ ProcessMonitor::StartLaunchOpThread(LaunchArgs *args, Error &error) Host::ThreadCreate(g_thread_name, LaunchOpThread, args, &error); } -void -ProcessMonitor::StopLaunchOpThread() -{ - lldb::thread_result_t result; - - if (!IS_VALID_LLDB_HOST_THREAD(m_operation_thread)) - return; - - Host::ThreadCancel(m_operation_thread, NULL); - Host::ThreadJoin(m_operation_thread, &result, NULL); -} - void * ProcessMonitor::LaunchOpThread(void *arg) { @@ -1142,19 +1130,15 @@ ProcessMonitor::StartAttachOpThread(AttachArgs *args, lldb_private::Error &error Host::ThreadCreate(g_thread_name, AttachOpThread, args, &error); } -void -ProcessMonitor::StopAttachOpThread() -{ - assert(!"Not implemented yet!!!"); -} - void * ProcessMonitor::AttachOpThread(void *arg) { AttachArgs *args = static_cast(arg); - if (!Attach(args)) + if (!Attach(args)) { + sem_post(&args->m_semaphore); return NULL; + } ServeOperation(args); return NULL; @@ -1665,16 +1649,16 @@ ProcessMonitor::GetEventMessage(lldb::tid_t tid, unsigned long *message) return result; } -bool +lldb_private::Error ProcessMonitor::Detach() { - bool result; lldb_private::Error error; - DetachOperation op(error); - result = error.Success(); - DoOperation(&op); + if (m_pid != LLDB_INVALID_PROCESS_ID) { + DetachOperation op(error); + DoOperation(&op); + } StopMonitor(); - return result; + return error; } bool @@ -1705,13 +1689,25 @@ void ProcessMonitor::StopMonitor() { StopMonitoringChildProcess(); - StopLaunchOpThread(); + StopOpThread(); CloseFD(m_terminal_fd); CloseFD(m_client_fd); CloseFD(m_server_fd); } void +ProcessMonitor::StopOpThread() +{ + lldb::thread_result_t result; + + if (!IS_VALID_LLDB_HOST_THREAD(m_operation_thread)) + return; + + Host::ThreadCancel(m_operation_thread, NULL); + Host::ThreadJoin(m_operation_thread, &result, NULL); +} + +void ProcessMonitor::CloseFD(int &fd) { if (fd != -1) diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.h b/lldb/source/Plugins/Process/Linux/ProcessMonitor.h index 03e8c8c..4594ff4 100644 --- a/lldb/source/Plugins/Process/Linux/ProcessMonitor.h +++ b/lldb/source/Plugins/Process/Linux/ProcessMonitor.h @@ -158,7 +158,7 @@ public: bool BringProcessIntoLimbo(); - bool + lldb_private::Error Detach(); @@ -213,9 +213,6 @@ private: void StartLaunchOpThread(LaunchArgs *args, lldb_private::Error &error); - void - StopLaunchOpThread(); - static void * LaunchOpThread(void *arg); @@ -238,9 +235,6 @@ private: void StartAttachOpThread(AttachArgs *args, lldb_private::Error &error); - void - StopAttachOpThread(); - static void * AttachOpThread(void *args); @@ -287,6 +281,10 @@ private: void StopMonitor(); + /// Stops the operation thread used to attach/launch a process. + void + StopOpThread(); + void CloseFD(int &fd); }; -- 2.7.4