Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/gc_verbose_java/VerboseManagerJava.cpp
5985 views
1
2
/*******************************************************************************
3
* Copyright (c) 1991, 2014 IBM Corp. and others
4
*
5
* This program and the accompanying materials are made available under
6
* the terms of the Eclipse Public License 2.0 which accompanies this
7
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
8
* or the Apache License, Version 2.0 which accompanies this distribution and
9
* is available at https://www.apache.org/licenses/LICENSE-2.0.
10
*
11
* This Source Code may also be made available under the following
12
* Secondary Licenses when the conditions for such availability set
13
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
14
* General Public License, version 2 with the GNU Classpath
15
* Exception [1] and GNU General Public License, version 2 with the
16
* OpenJDK Assembly Exception [2].
17
*
18
* [1] https://www.gnu.org/software/classpath/license.html
19
* [2] http://openjdk.java.net/legal/assembly-exception.html
20
*
21
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
22
*******************************************************************************/
23
24
#include "gcutils.h"
25
#include "modronnls.h"
26
#include "omr.h"
27
28
#include <string.h>
29
30
#include "EnvironmentBase.hpp"
31
#include "GCExtensions.hpp"
32
#include "VerboseManagerJava.hpp"
33
34
#include "VerboseHandlerOutput.hpp"
35
#if defined(J9VM_GC_REALTIME)
36
#include "VerboseHandlerOutputRealtime.hpp"
37
#endif /* defined(J9VM_GC_REALTIME) */
38
#if defined(J9VM_GC_MODRON_STANDARD)
39
#include "VerboseHandlerOutputStandardJava.hpp"
40
#endif /* defined(J9VM_GC_MODRON_STANDARD) */
41
#if defined(J9VM_GC_VLHGC)
42
#include "VerboseHandlerOutputVLHGC.hpp"
43
#endif /* defined(J9VM_GC_VLHGC) */
44
#include "VerboseWriter.hpp"
45
#include "VerboseWriterChain.hpp"
46
#include "VerboseWriterFileLoggingBuffered.hpp"
47
#include "VerboseWriterFileLoggingSynchronous.hpp"
48
#include "VerboseWriterHook.hpp"
49
#include "VerboseWriterStreamOutput.hpp"
50
#include "VerboseWriterTrace.hpp"
51
52
/**
53
* Create a new MM_VerboseManagerJava instance.
54
* @return Pointer to the new MM_VerboseManagerJava.
55
*/
56
MM_VerboseManager *
57
MM_VerboseManagerJava::newInstance(MM_EnvironmentBase *env, OMR_VM* vm)
58
{
59
MM_GCExtensions* extensions = MM_GCExtensions::getExtensions(vm);
60
61
MM_VerboseManagerJava *verboseManager = (MM_VerboseManagerJava *)extensions->getForge()->allocate(sizeof(MM_VerboseManagerJava), MM_AllocationCategory::FIXED, J9_GET_CALLSITE());
62
if (verboseManager) {
63
new(verboseManager) MM_VerboseManagerJava(vm);
64
if(!verboseManager->initialize(env)) {
65
verboseManager->kill(env);
66
verboseManager = NULL;
67
}
68
}
69
return verboseManager;
70
}
71
72
/**
73
* Initializes the MM_VerboseManager instance.
74
*/
75
bool
76
MM_VerboseManagerJava::initialize(MM_EnvironmentBase *env)
77
{
78
PORT_ACCESS_FROM_ENVIRONMENT(env);
79
MM_GCExtensions *extensions = MM_GCExtensions::getExtensions(env->getOmrVM());
80
_mmHooks = J9_HOOK_INTERFACE(extensions->hookInterface);
81
_mmPrivateHooks = J9_HOOK_INTERFACE(extensions->privateHookInterface);
82
_omrHooks = J9_HOOK_INTERFACE(extensions->omrHookInterface);
83
84
_writerChain = MM_VerboseWriterChain::newInstance(env);
85
if (NULL == _writerChain) {
86
return false;
87
}
88
89
if(NULL == (_verboseHandlerOutput = createVerboseHandlerOutputObject(env))) {
90
return false;
91
}
92
93
_lastOutputTime = j9time_hires_clock();
94
95
return true;
96
}
97
98
MM_VerboseHandlerOutput *
99
MM_VerboseManagerJava::createVerboseHandlerOutputObject(MM_EnvironmentBase *env)
100
{
101
MM_VerboseHandlerOutput *handler = NULL;
102
MM_GCExtensionsBase *extensions = env->getExtensions();
103
104
if (extensions->isMetronomeGC()) {
105
#if defined(J9VM_GC_REALTIME)
106
handler = MM_VerboseHandlerOutputRealtime::newInstance(env, this);
107
#endif /* defined(J9VM_GC_REALTIME) */
108
} else if (extensions->isVLHGC()) {
109
#if defined(J9VM_GC_VLHGC)
110
handler = MM_VerboseHandlerOutputVLHGC::newInstance(env, this);
111
#endif /* defined(J9VM_GC_VLHGC) */
112
} else if (extensions->isStandardGC()) {
113
#if defined(J9VM_GC_MODRON_STANDARD)
114
handler = MM_VerboseHandlerOutputStandardJava::newInstance(env, this);
115
#endif /* defined(J9VM_GC_MODRON_STANDARD) */
116
} else {
117
/* unknown collector type but verbose doesn't have assertions so just return NULL so that a caller will observe that we failed */
118
}
119
return handler;
120
}
121
122
MM_VerboseWriter *
123
MM_VerboseManagerJava::createWriter(MM_EnvironmentBase *env, WriterType type, char *filename, UDATA fileCount, UDATA iterations)
124
{
125
MM_VerboseWriter *writer = NULL;
126
127
switch(type) {
128
case VERBOSE_WRITER_STANDARD_STREAM:
129
writer = MM_VerboseWriterStreamOutput::newInstance(env, filename);
130
break;
131
132
case VERBOSE_WRITER_TRACE:
133
writer = MM_VerboseWriterTrace::newInstance(env);
134
break;
135
136
case VERBOSE_WRITER_HOOK:
137
writer = MM_VerboseWriterHook::newInstance(env);
138
break;
139
140
case VERBOSE_WRITER_FILE_LOGGING_SYNCHRONOUS:
141
writer = MM_VerboseWriterFileLoggingSynchronous::newInstance(env, this, filename, fileCount, iterations);
142
if (NULL == writer) {
143
writer = findWriterInChain(VERBOSE_WRITER_STANDARD_STREAM);
144
if (NULL != writer) {
145
writer->isActive(true);
146
return writer;
147
}
148
/* if we failed to create a file stream and there is no stderr stream try to create a stderr stream */
149
writer = MM_VerboseWriterStreamOutput::newInstance(env, NULL);
150
}
151
break;
152
153
case VERBOSE_WRITER_FILE_LOGGING_BUFFERED:
154
writer = MM_VerboseWriterFileLoggingBuffered::newInstance(env, this, filename, fileCount, iterations);
155
if (NULL == writer) {
156
writer = findWriterInChain(VERBOSE_WRITER_STANDARD_STREAM);
157
if (NULL != writer) {
158
writer->isActive(true);
159
return writer;
160
}
161
/* if we failed to create a file stream and there is no stderr stream try to create a stderr stream */
162
writer = MM_VerboseWriterStreamOutput::newInstance(env, NULL);
163
}
164
break;
165
166
default:
167
return NULL;
168
}
169
170
return writer;
171
}
172
173
void
174
MM_VerboseManagerJava::handleFileOpenError(MM_EnvironmentBase *env, char *fileName)
175
{
176
OMRPORT_ACCESS_FROM_OMRPORT(env->getPortLibrary());
177
omrnls_printf(J9NLS_ERROR, J9NLS_GC_UNABLE_TO_OPEN_FILE, fileName);
178
}
179
180
181