From 35824e36f5f3f39c6c4220ebd26b414a2b4e6350 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Fri, 20 Feb 2015 20:59:47 +0000 Subject: [PATCH] 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 --- lldb/source/Target/Process.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/lldb/source/Target/Process.cpp b/lldb/source/Target/Process.cpp index c4eccfc..88a76ff 100644 --- a/lldb/source/Target/Process.cpp +++ b/lldb/source/Target/Process.cpp @@ -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; } -- 2.7.4