[Lldb-commits] [lldb] r248702 - Revert "Fix race condition during process detach"

Pavel Labath via lldb-commits lldb-commits at lists.llvm.org
Mon Sep 28 02:37:51 PDT 2015


Author: labath
Date: Mon Sep 28 04:37:51 2015
New Revision: 248702

URL: http://llvm.org/viewvc/llvm-project?rev=248702&view=rev
Log:
Revert "Fix race condition during process detach"

This fix is not correct on its own until D12968 is resolved. Will resumbit once that is done.

Modified:
    lldb/trunk/include/lldb/Target/Process.h
    lldb/trunk/source/Target/Process.cpp
    lldb/trunk/test/functionalities/attach_resume/TestAttachResume.py

Modified: lldb/trunk/include/lldb/Target/Process.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Process.h?rev=248702&r1=248701&r2=248702&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Process.h (original)
+++ lldb/trunk/include/lldb/Target/Process.h Mon Sep 28 04:37:51 2015
@@ -3479,7 +3479,7 @@ protected:
     }
     
     Error
-    StopForDestroyOrDetach(lldb::EventSP &exit_event_sp);
+    HaltForDestroyOrDetach(lldb::EventSP &exit_event_sp);
 
     bool
     StateChangedIsExternallyHijacked();

Modified: lldb/trunk/source/Target/Process.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Process.cpp?rev=248702&r1=248701&r2=248702&view=diff
==============================================================================
--- lldb/trunk/source/Target/Process.cpp (original)
+++ lldb/trunk/source/Target/Process.cpp Mon Sep 28 04:37:51 2015
@@ -3916,46 +3916,52 @@ Process::Halt (bool clear_thread_plans)
 }
 
 Error
-Process::StopForDestroyOrDetach(lldb::EventSP &exit_event_sp)
+Process::HaltForDestroyOrDetach(lldb::EventSP &exit_event_sp)
 {
     Error error;
     if (m_public_state.GetValue() == eStateRunning)
     {
         Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
         if (log)
-            log->Printf("Process::%s() About to stop.", __FUNCTION__);
-
-        SendAsyncInterrupt();
-
-        // Consume the interrupt event.
-        TimeValue timeout (TimeValue::Now());
-        timeout.OffsetWithSeconds(10);
-        StateType state = WaitForProcessToStop (&timeout, &exit_event_sp);
-
-        // If the process exited while we were waiting for it to stop, put the exited event into
-        // the shared pointer passed in and return.  Our caller doesn't need to do anything else, since
-        // they don't have a process anymore...
-
-        if (state == eStateExited || m_private_state.GetValue() == eStateExited)
+            log->Printf("Process::%s() About to halt.", __FUNCTION__);
+        error = Halt();
+        if (error.Success())
         {
-            if (log)
-                log->Printf("Process::%s() Process exited while waiting to stop.", __FUNCTION__);
-            return error;
+            // Consume the halt event.
+            TimeValue timeout (TimeValue::Now());
+            timeout.OffsetWithSeconds(1);
+            StateType state = WaitForProcessToStop (&timeout, &exit_event_sp);
+            
+            // If the process exited while we were waiting for it to stop, put the exited event into
+            // the shared pointer passed in and return.  Our caller doesn't need to do anything else, since
+            // they don't have a process anymore...
+            
+            if (state == eStateExited || m_private_state.GetValue() == eStateExited)
+            {
+                if (log)
+                    log->Printf("Process::HaltForDestroyOrDetach() Process exited while waiting to Halt.");
+                return error;
+            }
+            else
+                exit_event_sp.reset(); // It is ok to consume any non-exit stop events
+    
+            if (state != eStateStopped)
+            {
+                if (log)
+                    log->Printf("Process::HaltForDestroyOrDetach() Halt failed to stop, state is: %s", StateAsCString(state));
+                // If we really couldn't stop the process then we should just error out here, but if the
+                // lower levels just bobbled sending the event and we really are stopped, then continue on.
+                StateType private_state = m_private_state.GetValue();
+                if (private_state != eStateStopped)
+                {
+                    return error;
+                }
+            }
         }
         else
-            exit_event_sp.reset(); // It is ok to consume any non-exit stop events
-
-        if (state != eStateStopped)
         {
             if (log)
-                log->Printf("Process::%s() failed to stop, state is: %s", __FUNCTION__, StateAsCString(state));
-            // If we really couldn't stop the process then we should just error out here, but if the
-            // lower levels just bobbled sending the event and we really are stopped, then continue on.
-            StateType private_state = m_private_state.GetValue();
-            if (private_state != eStateStopped)
-            {
-                return error;
-            }
+                log->Printf("Process::HaltForDestroyOrDetach() Halt got error: %s", error.AsCString());
         }
     }
     return error;
@@ -3974,7 +3980,7 @@ Process::Detach (bool keep_stopped)
     {
         if (DetachRequiresHalt())
         {
-            error = StopForDestroyOrDetach (exit_event_sp);
+            error = HaltForDestroyOrDetach (exit_event_sp);
             if (!error.Success())
             {
                 m_destroy_in_process = false;
@@ -4048,7 +4054,7 @@ Process::Destroy (bool force_kill)
         EventSP exit_event_sp;
         if (DestroyRequiresHalt())
         {
-            error = StopForDestroyOrDetach(exit_event_sp);
+            error = HaltForDestroyOrDetach(exit_event_sp);
         }
         
         if (m_public_state.GetValue() != eStateRunning)
@@ -5225,7 +5231,7 @@ public:
                                 break;
                             case 'i':
                                 if (StateIsRunningState(m_process->GetState()))
-                                    m_process->SendAsyncInterrupt();
+                                    m_process->Halt();
                                 break;
                         }
                     }
@@ -5250,8 +5256,8 @@ public:
         // Do only things that are safe to do in an interrupt context (like in
         // a SIGINT handler), like write 1 byte to a file descriptor. This will
         // interrupt the IOHandlerProcessSTDIO::Run() and we can look at the byte
-        // that was written to the pipe and then call m_process->SendAsyncInterrupt()
-        // from a much safer location in code.
+        // that was written to the pipe and then call m_process->Halt() from a
+        // much safer location in code.
         if (m_active)
         {
             char ch = 'i'; // Send 'i' for interrupt

Modified: lldb/trunk/test/functionalities/attach_resume/TestAttachResume.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/attach_resume/TestAttachResume.py?rev=248702&r1=248701&r2=248702&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/attach_resume/TestAttachResume.py (original)
+++ lldb/trunk/test/functionalities/attach_resume/TestAttachResume.py Mon Sep 28 04:37:51 2015
@@ -15,6 +15,7 @@ class AttachResumeTestCase(TestBase):
     mydir = TestBase.compute_mydir(__file__)
 
     @expectedFailureFreeBSD('llvm.org/pr19310')
+    @expectedFlakeyLinux('llvm.org/pr19310')
     @expectedFailureWindows("llvm.org/pr24778")
     @skipIfRemote
     @dwarf_test




More information about the lldb-commits mailing list