< prev index next >

src/share/vm/logging/logMessage.hpp

Print this page
rev 10178 : imported patch 8145934
rev 10179 : imported patch 8145934.01

*** 22,41 **** * */ #ifndef SHARE_VM_LOGGING_LOGMESSAGE_HPP #define SHARE_VM_LOGGING_LOGMESSAGE_HPP #include "logging/logDecorations.hpp" #include "logging/logLevel.hpp" - #include "logging/logPrefix.hpp" - #include "logging/logTagSet.hpp" - #include "logging/logTag.hpp" #include "memory/allocation.hpp" - #include "runtime/os.hpp" - #include "runtime/thread.hpp" - #include "utilities/debug.hpp" - #include "utilities/ostream.hpp" // The LogMessage class represents a multi-part/multi-line message // that is guaranteed to be sent and written to the log outputs // in a way that prevents interleaving by other log messages. // --- 22,35 ---- * */ #ifndef SHARE_VM_LOGGING_LOGMESSAGE_HPP #define SHARE_VM_LOGGING_LOGMESSAGE_HPP + #include "precompiled.hpp" #include "logging/logDecorations.hpp" #include "logging/logLevel.hpp" #include "memory/allocation.hpp" // The LogMessage class represents a multi-part/multi-line message // that is guaranteed to be sent and written to the log outputs // in a way that prevents interleaving by other log messages. //
*** 71,80 **** --- 65,75 ---- size_t message_offset; }; static const size_t InitialLineCapacity = 10; static const size_t InitialMessageBufferCapacity = 1024; bool _c_heap_allocated; + mutable bool _used; size_t _message_buffer_size; size_t _message_buffer_capacity; char* _message_buffer;
*** 84,107 **** LogLevelType _least_detailed_level; size_t (*_prefix_fn)(char*, size_t); - template <typename T> - void grow(T*& buffer, size_t& capacity, size_t minimum_length = 0) { - size_t new_size = capacity * 2; - if (new_size < minimum_length) { - new_size = minimum_length; - } - if (_c_heap_allocated) { - buffer = REALLOC_C_HEAP_ARRAY(T, buffer, new_size, mtLogging); - } else { - buffer = REALLOC_RESOURCE_ARRAY(T, buffer, capacity, new_size); - } - capacity = new_size; - } - // Forbid copy assignment and copy constructor. void operator=(const LogMessage& ref) {} LogMessage(const LogMessage& ref) {} public: --- 79,88 ----
*** 144,184 **** _decorations.set_level(_message._lines[_current_line_index].level); return _decorations; } }; ! LogMessage() : _message_buffer_size(0), ! _message_buffer_capacity(InitialMessageBufferCapacity), ! _line_count(0), ! _line_capacity(InitialLineCapacity), ! _c_heap_allocated(Thread::current_or_null() == NULL), ! _prefix_fn(NULL), ! _least_detailed_level(LogLevel::Off) { ! if (_c_heap_allocated) { ! _lines = NEW_C_HEAP_ARRAY(LogLine, _message_buffer_capacity, mtLogging); ! _message_buffer = NEW_C_HEAP_ARRAY(char, InitialMessageBufferCapacity, mtLogging); ! } else { ! _lines = NEW_RESOURCE_ARRAY(LogLine, _message_buffer_capacity); ! _message_buffer = NEW_RESOURCE_ARRAY(char, InitialMessageBufferCapacity); ! } ! } ! ! ~LogMessage() { ! if (_c_heap_allocated) { ! FREE_C_HEAP_ARRAY(LogLine, _lines); ! FREE_C_HEAP_ARRAY(char, _message_buffer); ! } else { ! FREE_RESOURCE_ARRAY(LogLine, _lines, _line_capacity); ! FREE_RESOURCE_ARRAY(char, _message_buffer, _message_buffer_capacity); ! } ! } LogLevelType least_detailed_level() const { return _least_detailed_level; } Iterator iterator(LogLevelType level, LogDecorations& decorations) const { return Iterator(*this, level, decorations); } // LogMessages are not automatically prefixed based on tags like regular // simple messages (see LogPrefix.hpp for more information about prefixes). --- 125,143 ---- _decorations.set_level(_message._lines[_current_line_index].level); return _decorations; } }; ! LogMessage(); ! ~LogMessage(); LogLevelType least_detailed_level() const { return _least_detailed_level; } Iterator iterator(LogLevelType level, LogDecorations& decorations) const { + _used = true; return Iterator(*this, level, decorations); } // LogMessages are not automatically prefixed based on tags like regular // simple messages (see LogPrefix.hpp for more information about prefixes).
*** 189,260 **** void set_prefix(size_t (*prefix_fn)(char*, size_t)) { _prefix_fn = prefix_fn; } ATTRIBUTE_PRINTF(3, 4) ! void write(LogLevelType level, const char* fmt, ...) { ! va_list args; ! va_start(args, fmt); ! vwrite(level, fmt, args); ! va_end(args); ! }; ATTRIBUTE_PRINTF(3, 0) ! void vwrite(LogLevelType level, const char* fmt, va_list args) { ! if (level > _least_detailed_level) { ! _least_detailed_level = level; ! } ! ! size_t written; ! for (int attempts = 0; attempts < 2; attempts++) { ! written = 0; ! size_t remaining_buffer_length = _message_buffer_capacity - _message_buffer_size; ! char* current_buffer_position = _message_buffer + _message_buffer_size; ! if (_prefix_fn != NULL) { ! written += _prefix_fn(current_buffer_position, remaining_buffer_length); ! current_buffer_position += written; ! if (remaining_buffer_length < written) { ! remaining_buffer_length = 0; ! } else { ! remaining_buffer_length -= written; ! } ! } ! va_list copy; ! va_copy(copy, args); ! written += (size_t)os::log_vsnprintf(current_buffer_position, remaining_buffer_length, fmt, copy) + 1; ! va_end(copy); ! if (written > _message_buffer_capacity - _message_buffer_size) { ! assert(attempts == 0, "Second attempt should always have a sufficiently large buffer (resized to fit)."); ! grow(_message_buffer, _message_buffer_capacity, _message_buffer_size + written); ! continue; ! } ! break; ! } ! ! if (_line_count == _line_capacity) { ! grow(_lines, _line_capacity); ! } ! ! _lines[_line_count].level = level; ! _lines[_line_count].message_offset = _message_buffer_size; ! _message_buffer_size += written; ! _line_count++; ! } ! ! #define LOG_LEVEL(level, name) ATTRIBUTE_PRINTF(2, 0) \ ! LogMessage& v##name(const char* fmt, va_list args) { \ ! vwrite(LogLevel::level, fmt, args); \ ! return *this; \ ! } \ ! LogMessage& name(const char* fmt, ...) ATTRIBUTE_PRINTF(2, 3) { \ ! va_list args; \ ! va_start(args, fmt); \ ! vwrite(LogLevel::level, fmt, args); \ ! va_end(args); \ ! return *this; \ ! } LOG_LEVEL_LIST #undef LOG_LEVEL }; #endif // SHARE_VM_LOGGING_LOGMESSAGE_HPP --- 148,165 ---- void set_prefix(size_t (*prefix_fn)(char*, size_t)) { _prefix_fn = prefix_fn; } ATTRIBUTE_PRINTF(3, 4) ! void write(LogLevelType level, const char* fmt, ...); ATTRIBUTE_PRINTF(3, 0) ! void vwrite(LogLevelType level, const char* fmt, va_list args); ! #define LOG_LEVEL(level, name) \ ! LogMessage& v##name(const char* fmt, va_list args) ATTRIBUTE_PRINTF(2, 0); \ ! LogMessage& name(const char* fmt, ...) ATTRIBUTE_PRINTF(2, 3); LOG_LEVEL_LIST #undef LOG_LEVEL }; #endif // SHARE_VM_LOGGING_LOGMESSAGE_HPP
< prev index next >