< prev index next >

src/hotspot/share/logging/logStream.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.

@@ -25,13 +25,14 @@
 #ifndef SHARE_LOGGING_LOGSTREAM_HPP
 #define SHARE_LOGGING_LOGSTREAM_HPP
 
 #include "logging/log.hpp"
 #include "logging/logHandle.hpp"
-#include "memory/resourceArea.hpp"
 #include "utilities/ostream.hpp"
 
+template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
+class AsyncLogTargetImpl;
 
 class LogStream : public outputStream {
   friend class LogStreamTest_TestLineBufferAllocation_test_vm_Test; // see test/native/logging/test_logStream.cpp
   friend class LogStreamTest_TestLineBufferAllocationCap_test_vm_Test; // see test/native/logging/test_logStream.cpp
 

@@ -50,50 +51,67 @@
     ~LineBuffer();
     bool is_empty() const { return _pos == 0; }
     const char* buffer() const { return _buf; }
     void append(const char* s, size_t len);
     void reset();
+    size_t size() const { return _pos; }
   };
   LineBuffer  _current_line;
   LogTargetHandle _log_handle;
 
+  bool _async_log;
+  LogMessageBuffer* _async_buffer;
+
   // Prevent operator new for LogStream.
   static void* operator new (size_t);
   static void* operator new[] (size_t);
 
+  void create_async_buffer();
+
 public:
   // Constructor to support creation from a LogTarget instance.
   //
   // LogTarget(Debug, gc) log;
   // LogStreamBase(log) stream;
   template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
   LogStream(const LogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>& type_carrier) :
-      _log_handle(level, &LogTagSetMapping<T0, T1, T2, T3, T4>::tagset()) {}
+      _log_handle(level, &LogTagSetMapping<T0, T1, T2, T3, T4>::tagset()), _async_log(false) {}
 
   // Constructor to support creation from typed (likely NULL) pointer. Mostly used by the logging framework.
   //
   // LogStreamBase stream(log.debug());
   //  or
   // LogStreamBase stream((LogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>*)NULL);
   template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
   LogStream(const LogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>* type_carrier) :
-      _log_handle(level, &LogTagSetMapping<T0, T1, T2, T3, T4>::tagset()) {}
+      _log_handle(level, &LogTagSetMapping<T0, T1, T2, T3, T4>::tagset()), _async_log(false) {}
 
   // Destructor writes any unfinished output left in the line buffer.
   ~LogStream();
 
   // Constructor to support creation from a LogTargetHandle.
   //
   // LogTarget(Debug, gc) log;
   // LogTargetHandle(log) handle;
   // LogStreamBase stream(handle);
-  LogStream(LogTargetHandle handle) : _log_handle(handle) {}
+  LogStream(LogTargetHandle handle) : _log_handle(handle), _async_log(false) {}
 
   // Constructor to support creation from a log level and tagset.
   //
   // LogStreamBase(level, tageset);
-  LogStream(LogLevelType level, LogTagSet* tagset) : _log_handle(level, tagset) {}
+  LogStream(LogLevelType level, LogTagSet* tagset) : _log_handle(level, tagset), _async_log(false) {}
+
+  template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
+  LogStream(const AsyncLogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>& type_carrier) :
+      _log_handle(level, &LogTagSetMapping<T0, T1, T2, T3, T4>::tagset()), _async_log(true), _async_buffer(NULL) {}
+
+  template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
+  LogStream(const AsyncLogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>* type_carrier) :
+      _log_handle(level, &LogTagSetMapping<T0, T1, T2, T3, T4>::tagset()), _async_log(true), _async_buffer(NULL) {}
+
+  LogStream(AsyncLogTargetHandle h) :
+      _log_handle(h.level(), h.tagset()), _async_log(true), _async_buffer(NULL) {}
 
   void write(const char* s, size_t len);
 };
 
 // Support creation of a LogStream without having to provide a LogTarget pointer.
< prev index next >