Avoid a race condition when loading core files where the process might still be handling the eStateStopped event we post to the private state thread causing us to return from SBTarget::LoadCore() before the process is ready to have API calls used on it.

This fixes a crasher that could happen when loading core files from scripts.

llvm-svn: 230060
This commit is contained in:
Greg Clayton 2015-02-20 20:59:47 +00:00
parent 9ecaa174d6
commit 35824e36f5
1 changed files with 17 additions and 1 deletions

View File

@ -3163,6 +3163,9 @@ Process::LoadCore ()
Error error = DoLoadCore();
if (error.Success())
{
Listener listener ("lldb.process.load_core_listener");
HijackPrivateProcessEvents(&listener);
if (PrivateStateThreadIsValid ())
ResumePrivateStateThread ();
else
@ -3183,7 +3186,20 @@ Process::LoadCore ()
// show all of the threads in the core file and explore the crashed
// state.
SetPrivateState (eStateStopped);
// Wait indefinitely for a stopped event since we just posted one above...
lldb::EventSP event_sp;
listener.WaitForEvent (NULL, event_sp);
StateType state = ProcessEventData::GetStateFromEvent(event_sp.get());
if (!StateIsStoppedState (state, false))
{
Log *log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
if (log)
log->Printf("Process::Halt() failed to stop, state is: %s", StateAsCString(state));
error.SetErrorString ("Did not get stopped event after loading the core file.");
}
RestorePrivateProcessEvents ();
}
return error;
}