From bb3a283b3e8bc2cc4157ef1b73b7d5e6cda40775 Mon Sep 17 00:00:00 2001 From: Jim Ingham Date: Sat, 29 Jan 2011 01:49:25 +0000 Subject: Added a completion action class to the Process events so that we can make things like Attach and later Launch start their job, and then return to the event loop while waiting for the work to be done. llvm-svn: 124520 --- lldb/source/Commands/CommandObjectProcess.cpp | 36 ++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) (limited to 'lldb/source/Commands/CommandObjectProcess.cpp') diff --git a/lldb/source/Commands/CommandObjectProcess.cpp b/lldb/source/Commands/CommandObjectProcess.cpp index 5239b7bf2d6..42bc4af3bb2 100644 --- a/lldb/source/Commands/CommandObjectProcess.cpp +++ b/lldb/source/Commands/CommandObjectProcess.cpp @@ -536,7 +536,8 @@ public: CommandReturnObject &result) { Target *target = m_interpreter.GetDebugger().GetSelectedTarget().get(); - + bool synchronous_execution = m_interpreter.GetSynchronous (); + Process *process = m_interpreter.GetDebugger().GetExecutionContext().process; if (process) { @@ -636,6 +637,24 @@ public: result.SetStatus (eReturnStatusFailed); return false; } + // If we're synchronous, wait for the stopped event and report that. + // Otherwise just return. + // FIXME: in the async case it will now be possible to get to the command + // interpreter with a state eStateAttaching. Make sure we handle that correctly. + if (synchronous_execution) + { + StateType state = process->WaitForProcessToStop (NULL); + + result.SetDidChangeProcessState (true); + result.AppendMessageWithFormat ("Process %i %s\n", process->GetID(), StateAsCString (state)); + result.SetStatus (eReturnStatusSuccessFinishNoResult); + } + else + { + result.SetDidChangeProcessState (true); + result.AppendMessageWithFormat ("Starting to attach to process."); + result.SetStatus (eReturnStatusSuccessFinishNoResult); + } } else { @@ -681,6 +700,21 @@ public: error.AsCString()); result.SetStatus (eReturnStatusFailed); } + // See comment for synchronous_execution above. + if (synchronous_execution) + { + StateType state = process->WaitForProcessToStop (NULL); + + result.SetDidChangeProcessState (true); + result.AppendMessageWithFormat ("Process %i %s\n", process->GetID(), StateAsCString (state)); + result.SetStatus (eReturnStatusSuccessFinishNoResult); + } + else + { + result.SetDidChangeProcessState (true); + result.AppendMessageWithFormat ("Starting to attach to process."); + result.SetStatus (eReturnStatusSuccessFinishNoResult); + } } else { -- cgit v1.2.3