Index: lldb/include/lldb/Core/IOHandler.h =================================================================== --- lldb/include/lldb/Core/IOHandler.h +++ lldb/include/lldb/Core/IOHandler.h @@ -163,10 +163,7 @@ void WaitForPop(); - virtual void PrintAsync(Stream *stream, const char *s, size_t len) { - stream->Write(s, len); - stream->Flush(); - } + virtual void PrintAsync(const char *s, size_t len, bool is_stdout); protected: Debugger &m_debugger; @@ -415,7 +412,7 @@ uint32_t GetCurrentLineIndex() const; - void PrintAsync(Stream *stream, const char *s, size_t len) override; + void PrintAsync(const char *s, size_t len, bool is_stdout) override; private: #if LLDB_ENABLE_LIBEDIT @@ -540,7 +537,7 @@ return ((m_top != nullptr) ? m_top->GetHelpPrologue() : nullptr); } - void PrintAsync(Stream *stream, const char *s, size_t len); + bool PrintAsync(const char *s, size_t len, bool is_stdout); protected: typedef std::vector collection; Index: lldb/source/Core/Debugger.cpp =================================================================== --- lldb/source/Core/Debugger.cpp +++ lldb/source/Core/Debugger.cpp @@ -1068,9 +1068,12 @@ } void Debugger::PrintAsync(const char *s, size_t len, bool is_stdout) { - lldb_private::StreamFile &stream = - is_stdout ? GetOutputStream() : GetErrorStream(); - m_io_handler_stack.PrintAsync(&stream, s, len); + bool printed = m_io_handler_stack.PrintAsync(s, len, is_stdout); + if (!printed) { + lldb::StreamFileSP stream = + is_stdout ? m_output_stream_sp : m_error_stream_sp; + stream->Write(s, len); + } } ConstString Debugger::GetTopIOHandlerControlSequence(char ch) { Index: lldb/source/Core/IOHandler.cpp =================================================================== --- lldb/source/Core/IOHandler.cpp +++ lldb/source/Core/IOHandler.cpp @@ -122,14 +122,18 @@ void IOHandler::WaitForPop() { m_popped.WaitForValueEqualTo(true); } -void IOHandlerStack::PrintAsync(Stream *stream, const char *s, size_t len) { - if (stream) { - std::lock_guard guard(m_mutex); - if (m_top) - m_top->PrintAsync(stream, s, len); - else - stream->Write(s, len); - } +void IOHandler::PrintAsync(const char *s, size_t len, bool is_stdout) { + lldb::StreamFileSP stream = is_stdout ? m_output_sp : m_error_sp; + stream->Write(s, len); + stream->Flush(); +} + +bool IOHandlerStack::PrintAsync(const char *s, size_t len, bool is_stdout) { + std::lock_guard guard(m_mutex); + if (!m_top) + return false; + m_top->PrintAsync(s, len, is_stdout); + return true; } IOHandlerConfirm::IOHandlerConfirm(Debugger &debugger, llvm::StringRef prompt, @@ -612,11 +616,12 @@ #endif } -void IOHandlerEditline::PrintAsync(Stream *stream, const char *s, size_t len) { +void IOHandlerEditline::PrintAsync(const char *s, size_t len, bool is_stdout) { #if LLDB_ENABLE_LIBEDIT - if (m_editline_up) - m_editline_up->PrintAsync(stream, s, len); - else + if (m_editline_up) { + lldb::StreamFileSP stream = is_stdout ? m_output_sp : m_error_sp; + m_editline_up->PrintAsync(stream.get(), s, len); + } else #endif { #ifdef _WIN32 @@ -633,7 +638,7 @@ SetConsoleCursorPosition(console_handle, coord); } #endif - IOHandler::PrintAsync(stream, s, len); + IOHandler::PrintAsync(s, len, is_stdout); #ifdef _WIN32 if (prompt) IOHandler::PrintAsync(GetOutputStreamFileSP().get(), prompt,