[Lldb-commits] [lldb] r231231 - Fix deadlock in operation thread in NativeProcessLinux

Tamas Berghammer tberghammer at google.com
Wed Mar 4 03:10:03 PST 2015


Author: tberghammer
Date: Wed Mar  4 05:10:03 2015
New Revision: 231231

URL: http://llvm.org/viewvc/llvm-project?rev=231231&view=rev
Log:
Fix deadlock in operation thread in NativeProcessLinux

The deadlock occurred when the Attach or the Launch operation failed for
any reason.

Differential revision: http://reviews.llvm.org/D8030

Modified:
    lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp

Modified: lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp?rev=231231&r1=231230&r2=231231&view=diff
==============================================================================
--- lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp (original)
+++ lldb/trunk/source/Plugins/Process/Linux/NativeProcessLinux.cpp Wed Mar  4 05:10:03 2015
@@ -143,6 +143,8 @@ namespace
     using namespace lldb;
     using namespace lldb_private;
 
+    static void * const EXIT_OPERATION = nullptr;
+
     const UnixSignals&
     GetUnixSignals ()
     {
@@ -3371,14 +3373,11 @@ NativeProcessLinux::ServeOperation(Opera
             assert(false && "Unexpected errno from sem_wait");
         }
 
-        // nullptr as operation means the operation thread should exit. Cancel() can't be used
-        // because it is not supported on android.
-        if (!monitor->m_operation)
-        {
-            // notify calling thread that operation is complete
-            sem_post(&monitor->m_operation_done);
+        // EXIT_OPERATION used to stop the operation thread because Cancel() isn't supported on
+        // android. We don't have to send a post to the m_operation_done semaphore because in this
+        // case the synchronization is achieved by a Join() call
+        if (monitor->m_operation == EXIT_OPERATION)
             break;
-        }
 
         reinterpret_cast<Operation*>(monitor->m_operation)->Execute(monitor);
 
@@ -3397,6 +3396,11 @@ NativeProcessLinux::DoOperation(void *op
     // notify operation thread that an operation is ready to be processed
     sem_post(&m_operation_pending);
 
+    // Don't wait for the operation to complete in case of an exit operation. The operation thread
+    // will exit without posting to the semaphore
+    if (m_operation == EXIT_OPERATION)
+        return;
+
     // wait for operation to complete
     while (sem_wait(&m_operation_done))
     {
@@ -3565,9 +3569,9 @@ NativeProcessLinux::StopMonitoringChildP
 void
 NativeProcessLinux::StopMonitor()
 {
-    StopOpThread();
     StopMonitoringChildProcess();
     StopCoordinatorThread ();
+    StopOpThread();
     sem_destroy(&m_operation_pending);
     sem_destroy(&m_operation_done);
 
@@ -3584,7 +3588,7 @@ NativeProcessLinux::StopOpThread()
     if (!m_operation_thread.IsJoinable())
         return;
 
-    DoOperation(nullptr); // nullptr as operation ask the operation thread to exit
+    DoOperation(EXIT_OPERATION);
     m_operation_thread.Join(nullptr);
 }
 





More information about the lldb-commits mailing list