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