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
This commit is contained in:
Jim Ingham 2012-05-23 15:46:31 +00:00
parent 8152e22073
commit 04e0a2270a
1 changed files with 26 additions and 0 deletions

View 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())
{