This patch captures and serializes all output being written by the

command line driver, including the lldb prompt being output by
editline, the asynchronous process output & error messages, and
asynchronous messages written by target stop-hooks.

As part of this it introduces a new Stream class,
StreamAsynchronousIO.  A StreamAsynchronousIO object is created with a
broadcaster, who will eventually broadcast the stream's data for a
listener to handle, and an event type indicating what type of event
the broadcaster will broadcast.  When the Write method is called on a
StreamAsynchronousIO object, the data is appended to an internal
string.  When the Flush method is called on a StreamAsynchronousIO
object, it broadcasts it's data string and clears the string.

Anything in lldb-core that needs to generate asynchronous output for
the end-user should use the StreamAsynchronousIO objects.

I have also added a new notification type for InputReaders, to let
them know that a asynchronous output has been written. This is to
allow the input readers to, for example, refresh their prompts and
lines, if desired.  I added the case statements to all the input
readers to catch this notification, but I haven't added any code for
handling them yet (except to the IOChannel input reader).

llvm-svn: 130721
This commit is contained in:
Caroline Tice
2011-05-02 20:41:46 +00:00
parent f897d3b88b
commit 969ed3d10f
25 changed files with 351 additions and 119 deletions

View File

@@ -20,6 +20,7 @@
#include "lldb/Core/Debugger.h"
#include "lldb/Core/Event.h"
#include "lldb/Core/Log.h"
#include "lldb/Core/StreamAsynchronousIO.h"
#include "lldb/Core/StreamString.h"
#include "lldb/Core/Timer.h"
#include "lldb/Core/ValueObject.h"
@@ -1104,8 +1105,12 @@ Target::RunStopHooks ()
if (num_exe_ctx == 0)
return;
result.SetImmediateOutputFile (m_debugger.GetOutputFile().GetStream());
result.SetImmediateErrorFile (m_debugger.GetErrorFile().GetStream());
StreamSP output_stream (new StreamAsynchronousIO (m_debugger.GetCommandInterpreter(),
CommandInterpreter::eBroadcastBitAsynchronousOutputData));
StreamSP error_stream (new StreamAsynchronousIO (m_debugger.GetCommandInterpreter(),
CommandInterpreter::eBroadcastBitAsynchronousErrorData));
result.SetImmediateOutputStream (output_stream);
result.SetImmediateErrorStream (error_stream);
bool keep_going = true;
bool hooks_ran = false;
@@ -1176,6 +1181,9 @@ Target::RunStopHooks ()
}
if (hooks_ran)
result.AppendMessage ("\n** End Stop Hooks **\n");
result.GetImmediateOutputStream()->Flush();
result.GetImmediateErrorStream()->Flush();
}
//--------------------------------------------------------------