diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp b/lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp index 4daccee945fb..46ea84bdf25f 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,12 +1689,24 @@ 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) { diff --git a/lldb/source/Plugins/Process/Linux/ProcessMonitor.h b/lldb/source/Plugins/Process/Linux/ProcessMonitor.h index 03e8c8c45586..4594ff4a366c 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); };