< 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 >