--- old/src/hotspot/share/logging/logStream.hpp 2020-02-24 07:47:44.261103412 +0000 +++ new/src/hotspot/share/logging/logStream.hpp 2020-02-24 07:47:44.001101988 +0000 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it @@ -27,9 +27,10 @@ #include "logging/log.hpp" #include "logging/logHandle.hpp" -#include "memory/resourceArea.hpp" #include "utilities/ostream.hpp" +template +class AsyncLogTargetImpl; class LogStream : public outputStream { friend class LogStreamTest_TestLineBufferAllocation_test_vm_Test; // see test/native/logging/test_logStream.cpp @@ -52,14 +53,20 @@ const char* buffer() const { return _buf; } void append(const char* s, size_t len); void reset(); + size_t size() const { return _pos; } }; LineBuffer _current_line; LogTargetHandle _log_handle; + bool _async_log; + LogMessageBuffer* _async_buffer; + // Prevent operator new for LogStream. static void* operator new (size_t); static void* operator new[] (size_t); + void create_async_buffer(); + public: // Constructor to support creation from a LogTarget instance. // @@ -67,7 +74,7 @@ // LogStreamBase(log) stream; template LogStream(const LogTargetImpl& type_carrier) : - _log_handle(level, &LogTagSetMapping::tagset()) {} + _log_handle(level, &LogTagSetMapping::tagset()), _async_log(false) {} // Constructor to support creation from typed (likely NULL) pointer. Mostly used by the logging framework. // @@ -76,7 +83,7 @@ // LogStreamBase stream((LogTargetImpl*)NULL); template LogStream(const LogTargetImpl* type_carrier) : - _log_handle(level, &LogTagSetMapping::tagset()) {} + _log_handle(level, &LogTagSetMapping::tagset()), _async_log(false) {} // Destructor writes any unfinished output left in the line buffer. ~LogStream(); @@ -86,12 +93,23 @@ // LogTarget(Debug, gc) log; // LogTargetHandle(log) handle; // LogStreamBase stream(handle); - LogStream(LogTargetHandle handle) : _log_handle(handle) {} + LogStream(LogTargetHandle handle) : _log_handle(handle), _async_log(false) {} // Constructor to support creation from a log level and tagset. // // LogStreamBase(level, tageset); - LogStream(LogLevelType level, LogTagSet* tagset) : _log_handle(level, tagset) {} + LogStream(LogLevelType level, LogTagSet* tagset) : _log_handle(level, tagset), _async_log(false) {} + + template + LogStream(const AsyncLogTargetImpl& type_carrier) : + _log_handle(level, &LogTagSetMapping::tagset()), _async_log(true), _async_buffer(NULL) {} + + template + LogStream(const AsyncLogTargetImpl* type_carrier) : + _log_handle(level, &LogTagSetMapping::tagset()), _async_log(true), _async_buffer(NULL) {} + + LogStream(AsyncLogTargetHandle h) : + _log_handle(h.level(), h.tagset()), _async_log(true), _async_buffer(NULL) {} void write(const char* s, size_t len); };