Patch from Matt Kopec:
authorGreg Clayton <gclayton@apple.com>
Tue, 16 Oct 2012 20:20:18 +0000 (20:20 +0000)
committerGreg Clayton <gclayton@apple.com>
Tue, 16 Oct 2012 20:20:18 +0000 (20:20 +0000)
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

lldb/source/Plugins/Process/Linux/ProcessMonitor.cpp
lldb/source/Plugins/Process/Linux/ProcessMonitor.h

index 4daccee..46ea84b 100644 (file)
@@ -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<AttachArgs*>(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)
index 03e8c8c..4594ff4 100644 (file)
@@ -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);
 };