--- old/src/hotspot/share/logging/logMessageBuffer.hpp 2020-02-24 07:47:42.985096429 +0000 +++ new/src/hotspot/share/logging/logMessageBuffer.hpp 2020-02-24 07:47:42.725095008 +0000 @@ -28,8 +28,9 @@ #include "logging/logLevel.hpp" #include "memory/allocation.hpp" -class LogMessageBuffer : public StackObj { - friend class LogMessageTest; +class LogMessageBuffer : public CHeapObj { + friend class LogMessageTest_nwrite_test_vm_Test; + protected: struct LogLine { LogLevelType level; @@ -38,6 +39,7 @@ static const size_t InitialLineCapacity = 10; static const size_t InitialMessageBufferCapacity = 1024; + Arena* _arena; size_t _message_buffer_size; size_t _message_buffer_capacity; char* _message_buffer; @@ -51,16 +53,18 @@ size_t (*_prefix_fn)(char*, size_t); void initialize_buffers(); + template + void grow(T*& buffer, size_t& capacity, size_t minimum_length = 0); private: - // Forbid copy assignment and copy constructor. - void operator=(const LogMessageBuffer& ref) {} - LogMessageBuffer(const LogMessageBuffer& ref) {} + NONCOPYABLE(LogMessageBuffer); public: - LogMessageBuffer(); + LogMessageBuffer(Arena* arena = NULL); ~LogMessageBuffer(); + static size_t initial_buffer_size(); + class Iterator { private: const LogMessageBuffer& _message; @@ -97,6 +101,10 @@ void reset(); + Arena* arena() const { + return _arena; + } + LogLevelType least_detailed_level() const { return _least_detailed_level; } @@ -115,6 +123,8 @@ _prefix_fn = prefix_fn; } + void write_n(LogLevelType level, const char * s, size_t written); + ATTRIBUTE_PRINTF(3, 4) void write(LogLevelType level, const char* fmt, ...);