< prev index next >
src/hotspot/share/logging/logHandle.hpp
Print this page
rev 58036 : [mq]: asynclog
@@ -1,7 +1,7 @@
/*
- * Copyright (c) 2016, 2019, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
@@ -22,10 +22,11 @@
*
*/
#ifndef SHARE_LOGGING_LOGHANDLE_HPP
#define SHARE_LOGGING_LOGHANDLE_HPP
+#include "logging/asynclog.hpp"
#include "logging/log.hpp"
// Wraps a Log instance and throws away the template information.
//
// This can be used to pass a Log instance as a parameter without
@@ -68,22 +69,46 @@
// Wraps a LogTarget instance and throws away the template information.
//
// This can be used to pass a Log instance as a parameter without
// polluting the surrounding API with template functions.
-class LogTargetHandle {
-private:
+template<typename D>
+class LogTargetHandleBase {
+protected :
const LogLevelType _level;
LogTagSet* _tagset;
+ LogTargetHandleBase(LogLevelType level, LogTagSet* tagset) : _level(level), _tagset(tagset) {}
+
public:
- LogTargetHandle(LogLevelType level, LogTagSet* tagset) : _level(level), _tagset(tagset) {}
+ void print(const char* fmt, ...) ATTRIBUTE_PRINTF(2, 3) {
+ va_list args;
+ va_start(args, fmt);
+ static_cast<D*>(this)->print(fmt,args);
+ va_end(args);
+ }
+
+ bool is_enabled() const {
+ return _tagset->is_level(_level);
+ }
+
+ LogLevelType level() const {
+ return _level;
+ }
+
+ LogTagSet* tagset() const {
+ return _tagset;
+ }
+};
+
+class LogTargetHandle : public LogTargetHandleBase<LogTargetHandle> {
+public:
+ LogTargetHandle(LogLevelType level, LogTagSet* tagset) : LogTargetHandleBase<LogTargetHandle>(level, tagset) {}
template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
LogTargetHandle(const LogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>& type_carrier) :
- _level(level),
- _tagset(&LogTagSetMapping<T0, T1, T2, T3, T4>::tagset()) {}
+ LogTargetHandleBase<LogTargetHandle>(level, &LogTagSetMapping<T0, T1, T2, T3, T4>::tagset()) {}
template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
static LogTargetHandle create() {
return LogTargetHandle(LogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>());
}
@@ -92,13 +117,25 @@
va_list args;
va_start(args, fmt);
_tagset->vwrite(_level, fmt, args);
va_end(args);
}
+};
- bool is_enabled() const {
- return _tagset->is_level(_level);
+class AsyncLogTargetHandle : public LogTargetHandleBase<AsyncLogTargetHandle> {
+public:
+ template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
+ AsyncLogTargetHandle(const AsyncLogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>& type_carrier) :
+ LogTargetHandleBase<AsyncLogTargetHandle>(level, &LogTagSetMapping<T0, T1, T2, T3, T4>::tagset()) {}
+
+ template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
+ static AsyncLogTargetHandle create() {
+ return AsyncLogTargetHandle(AsyncLogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>());
}
+ void print(const char* fmt, ...) ATTRIBUTE_PRINTF(2, 3) {
+ DEBUG_ONLY(ShouldNotReachHere());
+ }
};
+
#endif // SHARE_LOGGING_LOGHANDLE_HPP
< prev index next >