Avoid a race condition when loading core files where the process might still be handl...
authorGreg Clayton <gclayton@apple.com>
Fri, 20 Feb 2015 20:59:47 +0000 (20:59 +0000)
committerGreg Clayton <gclayton@apple.com>
Fri, 20 Feb 2015 20:59:47 +0000 (20:59 +0000)
This fixes a crasher that could happen when loading core files from scripts.

llvm-svn: 230060

lldb/source/Target/Process.cpp

index c4eccfc..88a76ff 100644 (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;
 }