21 * questions.
22 *
23 */
24 #ifndef SHARE_VM_LOGGING_LOGPREFIX_HPP
25 #define SHARE_VM_LOGGING_LOGPREFIX_HPP
26
27 #include "gc/shared/gcId.hpp"
28 #include "logging/logTag.hpp"
29
30 // Prefixes prepend each log message for a specified tagset with a given prefix.
31 // These prefixes are written before the log message but after the log decorations.
32 //
33 // A prefix is defined as a function that takes a buffer (with some size) as argument.
34 // This function will be called for each log message, and should write the prefix
35 // to the given buffer. The function should return how many characters it wrote,
36 // which should never exceed the given size.
37 //
38 // List of prefixes for specific tags and/or tagsets.
39 // Syntax: LOG_PREFIX(<name of prefixer function>, LOG_TAGS(<chosen log tags>))
40 // Where the prefixer function matches the following signature: size_t (*)(char*, size_t)
41 #define LOG_PREFIX_LIST // Currently unused/empty
42
43 // The empty prefix, used when there's no prefix defined.
44 template <LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag = LogTag::__NO_TAG>
45 struct LogPrefix : public AllStatic {
46 STATIC_ASSERT(GuardTag == LogTag::__NO_TAG);
47 static size_t prefix(char* buf, size_t len) {
48 return 0;
49 }
50 };
51
52 #define LOG_PREFIX(fn, ...) \
53 template <> struct LogPrefix<__VA_ARGS__> { \
54 static size_t prefix(char* buf, size_t len) { \
55 DEBUG_ONLY(buf[0] = '\0';) \
56 size_t ret = fn(buf, len); \
57 assert(ret == strlen(buf), "Length mismatch ret (" SIZE_FORMAT ") != buf length (" SIZE_FORMAT ")", ret, strlen(buf)); \
58 return ret; \
59 } \
60 };
61 LOG_PREFIX_LIST
|
21 * questions.
22 *
23 */
24 #ifndef SHARE_VM_LOGGING_LOGPREFIX_HPP
25 #define SHARE_VM_LOGGING_LOGPREFIX_HPP
26
27 #include "gc/shared/gcId.hpp"
28 #include "logging/logTag.hpp"
29
30 // Prefixes prepend each log message for a specified tagset with a given prefix.
31 // These prefixes are written before the log message but after the log decorations.
32 //
33 // A prefix is defined as a function that takes a buffer (with some size) as argument.
34 // This function will be called for each log message, and should write the prefix
35 // to the given buffer. The function should return how many characters it wrote,
36 // which should never exceed the given size.
37 //
38 // List of prefixes for specific tags and/or tagsets.
39 // Syntax: LOG_PREFIX(<name of prefixer function>, LOG_TAGS(<chosen log tags>))
40 // Where the prefixer function matches the following signature: size_t (*)(char*, size_t)
41 #define LOG_PREFIX_LIST \
42 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc)) \
43 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, age)) \
44 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, alloc)) \
45 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, barrier)) \
46 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, compaction)) \
47 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, compaction, phases)) \
48 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, cpu)) \
49 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, ergo)) \
50 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, ergo, cset)) \
51 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, ergo, heap)) \
52 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, heap)) \
53 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, freelist)) \
54 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, liveness)) \
55 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, metaspace)) \
56 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, phases)) \
57 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, phases, start)) \
58 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, plab)) \
59 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, region)) \
60 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, remset)) \
61 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, ref)) \
62 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, ref, start)) \
63 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, start)) \
64 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, sweep)) \
65 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, task)) \
66 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, task, start)) \
67 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, task, stats)) \
68 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, task, time)) \
69 LOG_PREFIX(GCId::print_prefix, LOG_TAGS(gc, tlab))
70
71
72 // The empty prefix, used when there's no prefix defined.
73 template <LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag = LogTag::__NO_TAG>
74 struct LogPrefix : public AllStatic {
75 STATIC_ASSERT(GuardTag == LogTag::__NO_TAG);
76 static size_t prefix(char* buf, size_t len) {
77 return 0;
78 }
79 };
80
81 #define LOG_PREFIX(fn, ...) \
82 template <> struct LogPrefix<__VA_ARGS__> { \
83 static size_t prefix(char* buf, size_t len) { \
84 DEBUG_ONLY(buf[0] = '\0';) \
85 size_t ret = fn(buf, len); \
86 assert(ret == strlen(buf), "Length mismatch ret (" SIZE_FORMAT ") != buf length (" SIZE_FORMAT ")", ret, strlen(buf)); \
87 return ret; \
88 } \
89 };
90 LOG_PREFIX_LIST
|