--- old/src/hotspot/share/logging/logStream.cpp 2020-02-24 07:47:43.621099908 +0000 +++ new/src/hotspot/share/logging/logStream.cpp 2020-02-24 07:47:43.361098486 +0000 @@ -25,6 +25,8 @@ #include "precompiled.hpp" #include "logging/log.hpp" #include "logging/logStream.hpp" +#include "logging/logMessageBuffer.hpp" +#include "logging/logAsyncFlusher.hpp" LogStream::LineBuffer::LineBuffer() : _buf(_smallbuf), _cap(sizeof(_smallbuf)), _pos(0) @@ -104,20 +106,44 @@ void LogStream::write(const char* s, size_t len) { if (len > 0 && s[len - 1] == '\n') { _current_line.append(s, len - 1); // omit the newline. - _log_handle.print("%s", _current_line.buffer()); + if (!_async_log) { + _log_handle.print("%s", _current_line.buffer()); + } else { + if (!_async_buffer) { + _async_buffer = new (mtLogging)LogMessageBuffer(); + } + _async_buffer->write_n(_log_handle.level(), _current_line.buffer(), _current_line.size()); + } _current_line.reset(); } else { _current_line.append(s, len); } + update_position(s, len); } // Destructor writes any unfinished output left in the line buffer. LogStream::~LogStream() { - if (_current_line.is_empty() == false) { - _log_handle.print("%s", _current_line.buffer()); + if (!_current_line.is_empty()) { + if (!_async_log) { + _log_handle.print("%s", _current_line.buffer()); + } + else { + if (!_async_buffer) { + _async_buffer = new (mtLogging)LogMessageBuffer(); + } + _async_buffer->write_n(_log_handle.level(), _current_line.buffer(), _current_line.size()); + } _current_line.reset(); } -} + if (_async_log && _async_buffer) { + LogAsyncFlusher* flusher = LogAsyncFlusher::instance(); + flusher->enqueue(_log_handle.tagset(), _async_buffer); + } +} +void LogStream::create_async_buffer() { + Arena* arena = new (mtLogging)Arena(mtLogging, LogMessageBuffer::initial_buffer_size()); + _async_buffer = new (mtLogging)LogMessageBuffer(arena); +}