Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mobile
Path: blob/master/src/hotspot/share/logging/logStream.hpp
40930 views
1
/*
2
* Copyright (c) 2016, 2020, Oracle and/or its affiliates. All rights reserved.
3
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4
*
5
* This code is free software; you can redistribute it and/or modify it
6
* under the terms of the GNU General Public License version 2 only, as
7
* published by the Free Software Foundation.
8
*
9
* This code is distributed in the hope that it will be useful, but WITHOUT
10
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12
* version 2 for more details (a copy is included in the LICENSE file that
13
* accompanied this code).
14
*
15
* You should have received a copy of the GNU General Public License version
16
* 2 along with this work; if not, write to the Free Software Foundation,
17
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18
*
19
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20
* or visit www.oracle.com if you need additional information or have any
21
* questions.
22
*
23
*/
24
25
#ifndef SHARE_LOGGING_LOGSTREAM_HPP
26
#define SHARE_LOGGING_LOGSTREAM_HPP
27
28
#include "logging/log.hpp"
29
#include "logging/logHandle.hpp"
30
#include "utilities/ostream.hpp"
31
32
33
class LogStream : public outputStream {
34
// see test/hotspot/gtest/logging/test_logStream.cpp
35
friend class LogStreamTest_TestLineBufferAllocation_vm_Test;
36
friend class LogStreamTest_TestLineBufferAllocationCap_vm_Test;
37
38
// Helper class, maintains the line buffer. For small line lengths,
39
// we avoid malloc and use a fixed sized member char array. If LogStream
40
// is allocated on the stack, this means small lines are assembled
41
// directly on the stack.
42
class LineBuffer {
43
char _smallbuf[64];
44
char* _buf;
45
size_t _cap;
46
size_t _pos;
47
void try_ensure_cap(size_t cap);
48
public:
49
LineBuffer();
50
~LineBuffer();
51
bool is_empty() const { return _pos == 0; }
52
const char* buffer() const { return _buf; }
53
void append(const char* s, size_t len);
54
void reset();
55
};
56
LineBuffer _current_line;
57
LogTargetHandle _log_handle;
58
59
// Prevent operator new for LogStream.
60
static void* operator new (size_t);
61
static void* operator new[] (size_t);
62
63
public:
64
// Constructor to support creation from a LogTarget instance.
65
//
66
// LogTarget(Debug, gc) log;
67
// LogStreamBase(log) stream;
68
template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
69
LogStream(const LogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>& type_carrier) :
70
_log_handle(level, &LogTagSetMapping<T0, T1, T2, T3, T4>::tagset()) {}
71
72
// Constructor to support creation from typed (likely NULL) pointer. Mostly used by the logging framework.
73
//
74
// LogStreamBase stream(log.debug());
75
// or
76
// LogStreamBase stream((LogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>*)NULL);
77
template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
78
LogStream(const LogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>* type_carrier) :
79
_log_handle(level, &LogTagSetMapping<T0, T1, T2, T3, T4>::tagset()) {}
80
81
// Destructor writes any unfinished output left in the line buffer.
82
~LogStream();
83
84
// Constructor to support creation from a LogTargetHandle.
85
//
86
// LogTarget(Debug, gc) log;
87
// LogTargetHandle(log) handle;
88
// LogStreamBase stream(handle);
89
LogStream(LogTargetHandle handle) : _log_handle(handle) {}
90
91
// Constructor to support creation from a log level and tagset.
92
//
93
// LogStreamBase(level, tageset);
94
LogStream(LogLevelType level, LogTagSet* tagset) : _log_handle(level, tagset) {}
95
96
bool is_enabled() const {
97
return _log_handle.is_enabled();
98
}
99
100
void write(const char* s, size_t len);
101
};
102
103
// Support creation of a LogStream without having to provide a LogTarget pointer.
104
#define LogStreamHandle(level, ...) LogStreamTemplate<LogLevel::level, LOG_TAGS(__VA_ARGS__)>
105
106
template <LogLevelType level, LogTagType T0, LogTagType T1, LogTagType T2, LogTagType T3, LogTagType T4, LogTagType GuardTag>
107
class LogStreamTemplate : public LogStream {
108
public:
109
LogStreamTemplate() : LogStream((LogTargetImpl<level, T0, T1, T2, T3, T4, GuardTag>*)NULL) {}
110
};
111
112
#endif // SHARE_LOGGING_LOGSTREAM_HPP
113
114