From 04e0a2270ab079c98c4bde9a5c023de64443e758 Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Wed, 23 May 2012 15:46:31 +0000 Subject: [PATCH] Process::Destroy should Halt before it tries to destroy so we don't have race conditions where we are in the middle of trying to service an event when we go to Destroy. The AttachCompletionHandler should note that it has restarted the target if it indeed does so. llvm-svn: 157327 --- lldb/source/Target/Process.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index 658204c..832feaa 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -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()) { -- 2.7.4