> On Mar 21, 2016, at 12:34 PM, Robbin Ehn <robbin....@oracle.com> wrote: > > Hi all, please review this a somewhat bigger change-set. > > Updated with the feedback. > > New webrev: http://cr.openjdk.java.net/~rehn/8151993/v2/webrev/ > > Tested with jprt hotspot and I added 2 internal vm tests. > > (also 2 bugs fixed, missing va_end and a potential race when calling prefix > function twice (very unlikely))
I prefer this new approach to what was in the original RFR. A few comments: ------------------------------------------------------------------------------ src/share/vm/logging/log.hpp 91 class LogWrite : AllStatic { I think the name LogWrite is too generic and potentially useful in the future for this facility. I'd prefer something longer and more descriptive, e.g. something like LogWriteLarge{Impl,Helper}. ------------------------------------------------------------------------------ src/share/vm/logging/log.hpp 89 // Non-template helper class for implementing write-slowpath in cpp 90 template <LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag> class Log; 91 class LogWrite : AllStatic { 92 private: 93 template <LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag> friend class Log; The really long lines and lack of whitespace here makes this hard to read and confusing. It took several tries for me to spot the "class Log" on line 90 and on line 93. Only knowing that the LogWrite class and the write_large function couldn't possibly have template specs eventually helped me find them. So I think it would help readability to break up the declarations into shorter lines with the "[friend] class Log" parts on their own line, with some whitespace around them. And attach the "Non-template helper class" comment to the LogWrite class rather than the forward declaration. Aside: I keep wishing there were some macros for the various template parameter sequences that are really just workarounds for the lack of variadic templates. But that's a different problem. ------------------------------------------------------------------------------ src/share/vm/logging/log.hpp 95 static void write_large(LogTagSet& lts, Passing in the tagset is much better than my suggestion of some function pointers. Good. ------------------------------------------------------------------------------ src/share/vm/logging/log.hpp 156 va_end(saved_args); Good catch. ------------------------------------------------------------------------------ src/share/vm/logging/log.cpp Thanks for new tests. However, I'm not sure it's safe to assume we can create and remove files from the current directory when running these tests. Maybe mkstemp with a file in os::get_temp_directory()? Or maybe there's something like this already packaged up in hotspot? tmpfile would be ideal if there were a way to configure logging to use a file descriptor, but I don't see anything like that. ------------------------------------------------------------------------------ src/share/vm/logging/log.hpp 148 int msg_len = os::log_vsnprintf(buf + prefix_len, sizeof(buf) - prefix_len, fmt, args); 149 assert(msg_len >= 0, "Log message buffer issue"); I think I would prefer the pre-change int res = ...; assert(res >= 0, ...); followed by size_t msg_len = res; and eliminate the casts of msg_len. But I dislike casts... ------------------------------------------------------------------------------