Process::Destroy should Halt before it tries to destroy so we don't have race conditi...
authorJim Ingham <jingham@apple.com>
Wed, 23 May 2012 15:46:31 +0000 (15:46 +0000)
committerJim Ingham <jingham@apple.com>
Wed, 23 May 2012 15:46:31 +0000 (15:46 +0000)
The AttachCompletionHandler should note that it has restarted the target if it indeed does so.

llvm-svn: 157327

lldb/source/Target/Process.cpp

index 658204c..832feaa 100644 (file)
@@ -2553,6 +2553,7 @@ Process::AttachCompletionHandler::PerformAction (lldb::EventSP &event_sp)
                 {
                     --m_exec_count;
                     m_process->PrivateResume ();
+                    Process::ProcessEventData::SetRestartedInEvent (event_sp.get(), true);
                     return eEventActionRetry;
                 }
                 else
@@ -3026,6 +3027,31 @@ Process::Destroy ()
     if (error.Success())
     {
         DisableAllBreakpointSites();
+        if (m_public_state.GetValue() == eStateRunning)
+        {
+            error = Halt();
+            if (error.Success())
+            {
+                // Consume the halt event.
+                EventSP stop_event;
+                TimeValue timeout (TimeValue::Now());
+                timeout.OffsetWithMicroSeconds(1000);
+                StateType state = WaitForProcessToStop (&timeout);
+                if (state != eStateStopped)
+                {
+                    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
+                    if (log)
+                        log->Printf("Process::Destroy() Halt failed to stop, state is: %s", StateAsCString(state));
+                }
+            }
+            else
+            {
+                    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
+                    if (log)
+                        log->Printf("Process::Destroy() Halt got error: %s", error.AsCString());
+            }
+        }
+        
         error = DoDestroy();
         if (error.Success())
         {