< prev index next >
src/share/vm/logging/log.hpp
Print this page
rev 8933 : 8046148.01
@@ -21,14 +21,16 @@
* questions.
*
*/
#ifndef SHARE_VM_LOGGING_LOG_HPP
#define SHARE_VM_LOGGING_LOG_HPP
+
#include "logging/logLevel.hpp"
#include "logging/logPrefix.hpp"
#include "logging/logTagSet.hpp"
#include "logging/logTag.hpp"
+#include "memory/allocation.hpp"
#include "utilities/debug.hpp"
#include "utilities/ostream.hpp"
//
// Logging macros
@@ -71,12 +73,13 @@
// obj->print_on(log.debug_stream());
// }
//
#define LogHandle(...) Log<LOG_TAGS(__VA_ARGS__)>
-template <LogTagType T0, LogTagType T1 = LogTag::__NO_TAG, LogTagType T2 = LogTag::__NO_TAG, LogTagType T3 = LogTag::__NO_TAG, LogTagType T4 = LogTag::__NO_TAG, LogTagType GuardTag = LogTag::__NO_TAG>
-class Log {
+template <LogTagType T0, LogTagType T1 = LogTag::__NO_TAG, LogTagType T2 = LogTag::__NO_TAG, LogTagType T3 = LogTag::__NO_TAG,
+ LogTagType T4 = LogTag::__NO_TAG, LogTagType GuardTag = LogTag::__NO_TAG>
+class Log VALUE_OBJ_CLASS_SPEC {
private:
static const size_t LogBufferSize = 512;
public:
// Make sure no more than the maximum number of tags have been given.
// The GuardTag allows this to be detected if/when it happens. If the GuardTag
@@ -86,14 +89,32 @@
static bool is_level(LogLevelType level) {
return LogTagSetMapping<T0, T1, T2, T3, T4>::tagset().is_level(level);
}
template <LogLevelType Level>
- static void write(const char* fmt, ...) ATTRIBUTE_PRINTF(1, 2);
+ ATTRIBUTE_PRINTF(1, 2)
+ static void write(const char* fmt, ...) {
+ va_list args;
+ va_start(args, fmt);
+ vwrite<Level>(fmt, args);
+ va_end(args);
+ };
+
+ template <LogLevelType Level>
+ ATTRIBUTE_PRINTF(1, 0)
+ static void vwrite(const char* fmt, va_list args) {
+ char buf[LogBufferSize];
+ size_t prefix_len = LogPrefix<T0, T1, T2, T3, T4>::prefix(buf, sizeof(buf));
+ int ret = vsnprintf(buf + prefix_len, sizeof(buf) - prefix_len, fmt, args);
+ assert(ret >= 0 && (size_t)ret < sizeof(buf), "Log message too long");
+ puts<Level>(buf);
+ }
template <LogLevelType Level>
- static void vwrite(const char* fmt, va_list args) ATTRIBUTE_PRINTF(1, 0);
+ static void puts(const char* string) {
+ LogTagSetMapping<T0, T1, T2, T3, T4>::tagset().log(Level, string);
+ }
#define LOG_LEVEL(level, name) ATTRIBUTE_PRINTF(2, 0) \
Log& v##name(const char* fmt, va_list args) { \
vwrite<LogLevel::level>(fmt, args); \
return *this; \
@@ -113,25 +134,6 @@
}
LOG_LEVEL_LIST
#undef LOG_LEVEL
};
-template <LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
-template <LogLevelType Level>
-void Log<T0, T1, T2, T3, T4, GuardTag>::write(const char* fmt, ...) {
- va_list args;
- va_start(args, fmt);
- vwrite<Level>(fmt, args);
- va_end(args);
-}
-
-template <LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
-template <LogLevelType Level>
-void Log<T0, T1, T2, T3, T4, GuardTag>::vwrite(const char* fmt, va_list args) {
- char buf[LogBufferSize];
- size_t prefix_len = LogPrefix<T0, T1, T2, T3, T4>::prefix(buf, sizeof(buf));
- int ret = vsnprintf(buf + prefix_len, sizeof(buf) - prefix_len, fmt, args);
- assert(ret >= 0 && (size_t)ret < sizeof(buf), "Log message too long");
- LogTagSetMapping<T0, T1, T2, T3, T4>::tagset().log(Level, buf);
-}
-
-#endif
+#endif // SHARE_VM_LOGGING_LOG_HPP
< prev index next >