1 /*
  2  * Copyright (c) 2003, 2025, 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.  Oracle designates this
  8  * particular file as subject to the "Classpath" exception as provided
  9  * by Oracle in the LICENSE file that accompanied this code.
 10  *
 11  * This code is distributed in the hope that it will be useful, but WITHOUT
 12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 14  * version 2 for more details (a copy is included in the LICENSE file that
 15  * accompanied this code).
 16  *
 17  * You should have received a copy of the GNU General Public License version
 18  * 2 along with this work; if not, write to the Free Software Foundation,
 19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 20  *
 21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 22  * or visit www.oracle.com if you need additional information or have any
 23  * questions.
 24  */
 25 
 26 #include <jni.h>
 27 #include <stdlib.h>
 28 #include "jvm.h"
 29 #include "management.h"
 30 #include "sun_management_VMManagementImpl.h"
 31 
 32 #define MAX_VERSION_LEN   20
 33 
 34 JNIEXPORT jstring JNICALL
 35 Java_sun_management_VMManagementImpl_getVersion0
 36   (JNIEnv *env, jclass dummy)
 37 {
 38     char buf[MAX_VERSION_LEN];
 39     jstring version_string = NULL;
 40     unsigned int major = ((unsigned int) jmm_version & 0x0FFF0000) >> 16;
 41     unsigned int minor = ((unsigned int) jmm_version & 0xFF00) >> 8;
 42 
 43     snprintf(buf, sizeof(buf), "%d.%d", major, minor);
 44     version_string = (*env)->NewStringUTF(env, buf);
 45     return version_string;
 46 }
 47 
 48 static void setStaticBooleanField
 49    (JNIEnv* env, jclass cls, const char* name, jboolean value)
 50 {
 51     jfieldID fid;
 52     fid = (*env)->GetStaticFieldID(env, cls, name, "Z");
 53     if (fid != 0) {
 54         (*env)->SetStaticBooleanField(env, cls, fid, value);
 55     }
 56 }
 57 
 58 JNIEXPORT void JNICALL
 59 Java_sun_management_VMManagementImpl_initOptionalSupportFields
 60   (JNIEnv *env, jclass cls)
 61 {
 62     jmmOptionalSupport mos;
 63     jmm_interface->GetOptionalSupport(env, &mos);
 64 
 65     jboolean value;
 66 
 67     value = mos.isCompilationTimeMonitoringSupported;
 68     setStaticBooleanField(env, cls, "compTimeMonitoringSupport", value);
 69 
 70     value = mos.isThreadContentionMonitoringSupported;
 71     setStaticBooleanField(env, cls, "threadContentionMonitoringSupport", value);
 72 
 73     value = mos.isCurrentThreadCpuTimeSupported;
 74     setStaticBooleanField(env, cls, "currentThreadCpuTimeSupport", value);
 75 
 76     value = mos.isOtherThreadCpuTimeSupported;
 77     setStaticBooleanField(env, cls, "otherThreadCpuTimeSupport", value);
 78 
 79     if (jmm_version >= JMM_VERSION_1_1) {
 80         value = mos.isObjectMonitorUsageSupported;
 81         setStaticBooleanField(env, cls, "objectMonitorUsageSupport", value);
 82 
 83         value = mos.isSynchronizerUsageSupported;
 84         setStaticBooleanField(env, cls, "synchronizerUsageSupport", value);
 85     } else {
 86         setStaticBooleanField(env, cls, "objectMonitorUsageSupport", JNI_FALSE);
 87         setStaticBooleanField(env, cls, "synchronizerUsageSupport", JNI_FALSE);
 88     }
 89 
 90     value = mos.isThreadAllocatedMemorySupported;
 91     setStaticBooleanField(env, cls, "threadAllocatedMemorySupport", value);
 92 
 93     value = mos.isRemoteDiagnosticCommandsSupported;
 94     setStaticBooleanField(env, cls, "remoteDiagnosticCommandsSupport", value);
 95 }
 96 
 97 JNIEXPORT jobjectArray JNICALL
 98 Java_sun_management_VMManagementImpl_getVmArguments0
 99   (JNIEnv *env, jobject dummy)
100 {
101     return JVM_GetVmArguments(env);
102 }
103 
104 JNIEXPORT jlong JNICALL
105 Java_sun_management_VMManagementImpl_getTotalClassCount
106   (JNIEnv *env, jobject dummy)
107 {
108     /* JMM_CLASS_LOADED_COUNT is the total number of classes loaded */
109     jlong count = jmm_interface->GetLongAttribute(env, NULL,
110                                                   JMM_CLASS_LOADED_COUNT);
111     return count;
112 }
113 
114 JNIEXPORT jlong JNICALL
115 Java_sun_management_VMManagementImpl_getUnloadedClassCount
116   (JNIEnv *env, jobject dummy)
117 {
118     /* JMM_CLASS_UNLOADED_COUNT is the total number of classes unloaded */
119     jlong count = jmm_interface->GetLongAttribute(env, NULL,
120                                                   JMM_CLASS_UNLOADED_COUNT);
121     return count;
122 }
123 
124 JNIEXPORT jboolean JNICALL
125 Java_sun_management_VMManagementImpl_getVerboseGC
126   (JNIEnv *env, jobject dummy)
127 {
128     return jmm_interface->GetBoolAttribute(env, JMM_VERBOSE_GC);
129 }
130 
131 JNIEXPORT jboolean JNICALL
132 Java_sun_management_VMManagementImpl_getVerboseClass
133   (JNIEnv *env, jobject dummy)
134 {
135     return jmm_interface->GetBoolAttribute(env, JMM_VERBOSE_CLASS);
136 }
137 
138 JNIEXPORT jlong JNICALL
139 Java_sun_management_VMManagementImpl_getTotalThreadCount
140   (JNIEnv *env, jobject dummy)
141 {
142     return jmm_interface->GetLongAttribute(env, NULL,
143                                            JMM_THREAD_TOTAL_COUNT);
144 }
145 
146 JNIEXPORT jint JNICALL
147 Java_sun_management_VMManagementImpl_getLiveThreadCount
148   (JNIEnv *env, jobject dummy)
149 {
150     jlong count = jmm_interface->GetLongAttribute(env, NULL,
151                                                   JMM_THREAD_LIVE_COUNT);
152     return (jint) count;
153 }
154 
155 JNIEXPORT jint JNICALL
156 Java_sun_management_VMManagementImpl_getPeakThreadCount
157   (JNIEnv *env, jobject dummy)
158 {
159     jlong count = jmm_interface->GetLongAttribute(env, NULL,
160                                                   JMM_THREAD_PEAK_COUNT);
161     return (jint) count;
162 }
163 
164 JNIEXPORT jint JNICALL
165 Java_sun_management_VMManagementImpl_getDaemonThreadCount
166   (JNIEnv *env, jobject dummy)
167 {
168     jlong count = jmm_interface->GetLongAttribute(env, NULL,
169                                                   JMM_THREAD_DAEMON_COUNT);
170     return (jint) count;
171 }
172 
173 JNIEXPORT jlong JNICALL
174 Java_sun_management_VMManagementImpl_getTotalCompileTime
175   (JNIEnv *env, jobject dummy)
176 {
177     return jmm_interface->GetLongAttribute(env, NULL,
178                                            JMM_COMPILE_TOTAL_TIME_MS);
179 }
180 
181 JNIEXPORT jlong JNICALL
182 Java_sun_management_VMManagementImpl_getStartupTime
183   (JNIEnv *env, jobject dummy)
184 {
185     return jmm_interface->GetLongAttribute(env, NULL,
186                                            JMM_JVM_INIT_DONE_TIME_MS);
187 }
188 
189 JNIEXPORT jlong JNICALL
190 Java_sun_management_VMManagementImpl_getUptime0
191   (JNIEnv *env, jobject dummy)
192 {
193     return jmm_interface->GetLongAttribute(env, NULL, JMM_JVM_UPTIME_MS);
194 }
195 
196 JNIEXPORT jboolean JNICALL
197 Java_sun_management_VMManagementImpl_isThreadContentionMonitoringEnabled
198   (JNIEnv *env, jobject dummy)
199 {
200     return jmm_interface->GetBoolAttribute(env,
201                                            JMM_THREAD_CONTENTION_MONITORING);
202 }
203 
204 JNIEXPORT jboolean JNICALL
205 Java_sun_management_VMManagementImpl_isThreadCpuTimeEnabled
206   (JNIEnv *env, jobject dummy)
207 {
208     return jmm_interface->GetBoolAttribute(env, JMM_THREAD_CPU_TIME);
209 }
210 
211 JNIEXPORT jboolean JNICALL
212 Java_sun_management_VMManagementImpl_isThreadAllocatedMemoryEnabled
213   (JNIEnv *env, jobject dummy)
214 {
215     return jmm_interface->GetBoolAttribute(env, JMM_THREAD_ALLOCATED_MEMORY);
216 }
217 
218 JNIEXPORT jint JNICALL
219 Java_sun_management_VMManagementImpl_getProcessId
220   (JNIEnv *env, jobject dummy)
221 {
222     jlong pid = jmm_interface->GetLongAttribute(env, NULL,
223                                                 JMM_OS_PROCESS_ID);
224     return (jint) pid;
225 }
226 
227 JNIEXPORT jint JNICALL
228 Java_sun_management_VMManagementImpl_getAvailableProcessors
229   (JNIEnv *env, jobject dummy)
230 {
231     return JVM_ActiveProcessorCount();
232 }
233 
234 JNIEXPORT jlong JNICALL
235 Java_sun_management_VMManagementImpl_getSafepointCount
236   (JNIEnv *env, jobject dummy)
237 {
238     return jmm_interface->GetLongAttribute(env, NULL,
239                                            JMM_SAFEPOINT_COUNT);
240 }
241 
242 JNIEXPORT jlong JNICALL
243 Java_sun_management_VMManagementImpl_getTotalSafepointTime
244   (JNIEnv *env, jobject dummy)
245 {
246     return jmm_interface->GetLongAttribute(env, NULL,
247                                            JMM_TOTAL_STOPPED_TIME_MS);
248 }
249 
250 JNIEXPORT jlong JNICALL
251 Java_sun_management_VMManagementImpl_getSafepointSyncTime
252   (JNIEnv *env, jobject dummy)
253 {
254     return jmm_interface->GetLongAttribute(env, NULL,
255                                            JMM_TOTAL_SAFEPOINTSYNC_TIME_MS);
256 }
257 
258 JNIEXPORT jlong JNICALL
259 Java_sun_management_VMManagementImpl_getTotalApplicationNonStoppedTime
260   (JNIEnv *env, jobject dummy)
261 {
262     return jmm_interface->GetLongAttribute(env, NULL,
263                                            JMM_TOTAL_APP_TIME_MS);
264 }
265 
266 JNIEXPORT jlong JNICALL
267 Java_sun_management_VMManagementImpl_getLoadedClassSize
268   (JNIEnv *env, jobject dummy)
269 {
270     return jmm_interface->GetLongAttribute(env, NULL,
271                                            JMM_CLASS_LOADED_BYTES);
272 }
273 
274 JNIEXPORT jlong JNICALL
275 Java_sun_management_VMManagementImpl_getUnloadedClassSize
276   (JNIEnv *env, jobject dummy)
277 {
278     return jmm_interface->GetLongAttribute(env, NULL,
279                                            JMM_CLASS_UNLOADED_BYTES);
280 }
281 JNIEXPORT jlong JNICALL
282 Java_sun_management_VMManagementImpl_getClassLoadingTime
283   (JNIEnv *env, jobject dummy)
284 {
285     return jmm_interface->GetLongAttribute(env, NULL,
286                                            JMM_TOTAL_CLASSLOAD_TIME_MS);
287 }
288 
289 
290 JNIEXPORT jlong JNICALL
291 Java_sun_management_VMManagementImpl_getMethodDataSize
292   (JNIEnv *env, jobject dummy)
293 {
294     return jmm_interface->GetLongAttribute(env, NULL,
295                                            JMM_METHOD_DATA_SIZE_BYTES);
296 }
297 
298 JNIEXPORT jlong JNICALL
299 Java_sun_management_VMManagementImpl_getInitializedClassCount
300   (JNIEnv *env, jobject dummy)
301 {
302     return jmm_interface->GetLongAttribute(env, NULL,
303                                            JMM_CLASS_INIT_TOTAL_COUNT);
304 }
305 
306 JNIEXPORT jlong JNICALL
307 Java_sun_management_VMManagementImpl_getClassInitializationTime
308   (JNIEnv *env, jobject dummy)
309 {
310     return jmm_interface->GetLongAttribute(env, NULL,
311                                            JMM_CLASS_INIT_TOTAL_TIME_MS);
312 }
313 
314 JNIEXPORT jlong JNICALL
315 Java_sun_management_VMManagementImpl_getClassVerificationTime
316   (JNIEnv *env, jobject dummy)
317 {
318     return jmm_interface->GetLongAttribute(env, NULL,
319                                            JMM_CLASS_VERIFY_TOTAL_TIME_MS);
320 }