mirror of
https://github.com/intel/llvm.git
synced 2026-01-23 07:58:23 +08:00
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:
@@ -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();
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user