1 /*
2  * Copyright (c) 2003, 2013, 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
Java_sun_management_VMManagementImpl_getVersion0(JNIEnv * env,jclass dummy)35 Java_sun_management_VMManagementImpl_getVersion0
36   (JNIEnv *env, jclass dummy)
37 {
38     char buf[MAX_VERSION_LEN];
39     jstring version_string = NULL;
40 
41     unsigned int major = ((unsigned int) jmm_version & 0x0FFF0000) >> 16;
42     unsigned int minor = ((unsigned int) jmm_version & 0xFF00) >> 8;
43 
44     // for internal use
45     unsigned int micro = (unsigned int) jmm_version & 0xFF;
46 
47     sprintf(buf, "%d.%d", major, minor);
48     version_string = (*env)->NewStringUTF(env, buf);
49     return version_string;
50 }
51 
setStaticBooleanField(JNIEnv * env,jclass cls,const char * name,jboolean value)52 static void setStaticBooleanField
53    (JNIEnv* env, jclass cls, const char* name, jboolean value)
54 {
55     jfieldID fid;
56     fid = (*env)->GetStaticFieldID(env, cls, name, "Z");
57     if (fid != 0) {
58         (*env)->SetStaticBooleanField(env, cls, fid, value);
59     }
60 }
61 
62 JNIEXPORT void JNICALL
Java_sun_management_VMManagementImpl_initOptionalSupportFields(JNIEnv * env,jclass cls)63 Java_sun_management_VMManagementImpl_initOptionalSupportFields
64   (JNIEnv *env, jclass cls)
65 {
66     jmmOptionalSupport mos;
67     jint ret = jmm_interface->GetOptionalSupport(env, &mos);
68 
69     jboolean value;
70 
71     value = mos.isCompilationTimeMonitoringSupported;
72     setStaticBooleanField(env, cls, "compTimeMonitoringSupport", value);
73 
74     value = mos.isThreadContentionMonitoringSupported;
75     setStaticBooleanField(env, cls, "threadContentionMonitoringSupport", value);
76 
77     value = mos.isCurrentThreadCpuTimeSupported;
78     setStaticBooleanField(env, cls, "currentThreadCpuTimeSupport", value);
79 
80     value = mos.isOtherThreadCpuTimeSupported;
81     setStaticBooleanField(env, cls, "otherThreadCpuTimeSupport", value);
82 
83     value = mos.isBootClassPathSupported;
84     setStaticBooleanField(env, cls, "bootClassPathSupport", value);
85 
86     if (jmm_version >= JMM_VERSION_1_1) {
87         value = mos.isObjectMonitorUsageSupported;
88         setStaticBooleanField(env, cls, "objectMonitorUsageSupport", value);
89 
90         value = mos.isSynchronizerUsageSupported;
91         setStaticBooleanField(env, cls, "synchronizerUsageSupport", value);
92     } else {
93         setStaticBooleanField(env, cls, "objectMonitorUsageSupport", JNI_FALSE);
94         setStaticBooleanField(env, cls, "synchronizerUsageSupport", JNI_FALSE);
95     }
96 
97     value = mos.isThreadAllocatedMemorySupported;
98     setStaticBooleanField(env, cls, "threadAllocatedMemorySupport", value);
99 
100     value = mos.isRemoteDiagnosticCommandsSupported;
101     setStaticBooleanField(env, cls, "remoteDiagnosticCommandsSupport", value);
102 
103     if ((jmm_version > JMM_VERSION_1_2) ||
104         (jmm_version == JMM_VERSION_1_2 && ((jmm_version&0xFF) >= 1))) {
105         setStaticBooleanField(env, cls, "gcNotificationSupport", JNI_TRUE);
106     } else {
107         setStaticBooleanField(env, cls, "gcNotificationSupport", JNI_FALSE);
108     }
109 }
110 
111 JNIEXPORT jobjectArray JNICALL
Java_sun_management_VMManagementImpl_getVmArguments0(JNIEnv * env,jobject dummy)112 Java_sun_management_VMManagementImpl_getVmArguments0
113   (JNIEnv *env, jobject dummy)
114 {
115     return jmm_interface->GetInputArgumentArray(env);
116 }
117 
118 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getTotalClassCount(JNIEnv * env,jobject dummy)119 Java_sun_management_VMManagementImpl_getTotalClassCount
120   (JNIEnv *env, jobject dummy)
121 {
122     /* JMM_CLASS_LOADED_COUNT is the total number of classes loaded */
123     jlong count = jmm_interface->GetLongAttribute(env, NULL,
124                                                   JMM_CLASS_LOADED_COUNT);
125     return count;
126 }
127 
128 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getUnloadedClassCount(JNIEnv * env,jobject dummy)129 Java_sun_management_VMManagementImpl_getUnloadedClassCount
130   (JNIEnv *env, jobject dummy)
131 {
132     /* JMM_CLASS_UNLOADED_COUNT is the total number of classes unloaded */
133     jlong count = jmm_interface->GetLongAttribute(env, NULL,
134                                                   JMM_CLASS_UNLOADED_COUNT);
135     return count;
136 }
137 
138 JNIEXPORT jboolean JNICALL
Java_sun_management_VMManagementImpl_getVerboseGC(JNIEnv * env,jobject dummy)139 Java_sun_management_VMManagementImpl_getVerboseGC
140   (JNIEnv *env, jobject dummy)
141 {
142     return jmm_interface->GetBoolAttribute(env, JMM_VERBOSE_GC);
143 }
144 
145 JNIEXPORT jboolean JNICALL
Java_sun_management_VMManagementImpl_getVerboseClass(JNIEnv * env,jobject dummy)146 Java_sun_management_VMManagementImpl_getVerboseClass
147   (JNIEnv *env, jobject dummy)
148 {
149     return jmm_interface->GetBoolAttribute(env, JMM_VERBOSE_CLASS);
150 }
151 
152 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getTotalThreadCount(JNIEnv * env,jobject dummy)153 Java_sun_management_VMManagementImpl_getTotalThreadCount
154   (JNIEnv *env, jobject dummy)
155 {
156     return jmm_interface->GetLongAttribute(env, NULL,
157                                            JMM_THREAD_TOTAL_COUNT);
158 }
159 
160 JNIEXPORT jint JNICALL
Java_sun_management_VMManagementImpl_getLiveThreadCount(JNIEnv * env,jobject dummy)161 Java_sun_management_VMManagementImpl_getLiveThreadCount
162   (JNIEnv *env, jobject dummy)
163 {
164     jlong count = jmm_interface->GetLongAttribute(env, NULL,
165                                                   JMM_THREAD_LIVE_COUNT);
166     return (jint) count;
167 }
168 
169 JNIEXPORT jint JNICALL
Java_sun_management_VMManagementImpl_getPeakThreadCount(JNIEnv * env,jobject dummy)170 Java_sun_management_VMManagementImpl_getPeakThreadCount
171   (JNIEnv *env, jobject dummy)
172 {
173     jlong count = jmm_interface->GetLongAttribute(env, NULL,
174                                                   JMM_THREAD_PEAK_COUNT);
175     return (jint) count;
176 }
177 
178 JNIEXPORT jint JNICALL
Java_sun_management_VMManagementImpl_getDaemonThreadCount(JNIEnv * env,jobject dummy)179 Java_sun_management_VMManagementImpl_getDaemonThreadCount
180   (JNIEnv *env, jobject dummy)
181 {
182     jlong count = jmm_interface->GetLongAttribute(env, NULL,
183                                                   JMM_THREAD_DAEMON_COUNT);
184     return (jint) count;
185 }
186 
187 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getTotalCompileTime(JNIEnv * env,jobject dummy)188 Java_sun_management_VMManagementImpl_getTotalCompileTime
189   (JNIEnv *env, jobject dummy)
190 {
191     return jmm_interface->GetLongAttribute(env, NULL,
192                                            JMM_COMPILE_TOTAL_TIME_MS);
193 }
194 
195 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getStartupTime(JNIEnv * env,jobject dummy)196 Java_sun_management_VMManagementImpl_getStartupTime
197   (JNIEnv *env, jobject dummy)
198 {
199     return jmm_interface->GetLongAttribute(env, NULL,
200                                            JMM_JVM_INIT_DONE_TIME_MS);
201 }
202 
203 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getUptime0(JNIEnv * env,jobject dummy)204 Java_sun_management_VMManagementImpl_getUptime0
205   (JNIEnv *env, jobject dummy)
206 {
207     return jmm_interface->GetLongAttribute(env, NULL, JMM_JVM_UPTIME_MS);
208 }
209 
210 JNIEXPORT jboolean JNICALL
Java_sun_management_VMManagementImpl_isThreadContentionMonitoringEnabled(JNIEnv * env,jobject dummy)211 Java_sun_management_VMManagementImpl_isThreadContentionMonitoringEnabled
212   (JNIEnv *env, jobject dummy)
213 {
214     return jmm_interface->GetBoolAttribute(env,
215                                            JMM_THREAD_CONTENTION_MONITORING);
216 }
217 
218 JNIEXPORT jboolean JNICALL
Java_sun_management_VMManagementImpl_isThreadCpuTimeEnabled(JNIEnv * env,jobject dummy)219 Java_sun_management_VMManagementImpl_isThreadCpuTimeEnabled
220   (JNIEnv *env, jobject dummy)
221 {
222     return jmm_interface->GetBoolAttribute(env, JMM_THREAD_CPU_TIME);
223 }
224 
225 JNIEXPORT jboolean JNICALL
Java_sun_management_VMManagementImpl_isThreadAllocatedMemoryEnabled(JNIEnv * env,jobject dummy)226 Java_sun_management_VMManagementImpl_isThreadAllocatedMemoryEnabled
227   (JNIEnv *env, jobject dummy)
228 {
229     return jmm_interface->GetBoolAttribute(env, JMM_THREAD_ALLOCATED_MEMORY);
230 }
231 
232 JNIEXPORT jint JNICALL
Java_sun_management_VMManagementImpl_getProcessId(JNIEnv * env,jobject dummy)233 Java_sun_management_VMManagementImpl_getProcessId
234   (JNIEnv *env, jobject dummy)
235 {
236     jlong pid = jmm_interface->GetLongAttribute(env, NULL,
237                                                 JMM_OS_PROCESS_ID);
238     return (jint) pid;
239 }
240 
241 JNIEXPORT jint JNICALL
Java_sun_management_VMManagementImpl_getAvailableProcessors(JNIEnv * env,jobject dummy)242 Java_sun_management_VMManagementImpl_getAvailableProcessors
243   (JNIEnv *env, jobject dummy)
244 {
245     return JVM_ActiveProcessorCount();
246 }
247 
248 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getSafepointCount(JNIEnv * env,jobject dummy)249 Java_sun_management_VMManagementImpl_getSafepointCount
250   (JNIEnv *env, jobject dummy)
251 {
252     return jmm_interface->GetLongAttribute(env, NULL,
253                                            JMM_SAFEPOINT_COUNT);
254 }
255 
256 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getTotalSafepointTime(JNIEnv * env,jobject dummy)257 Java_sun_management_VMManagementImpl_getTotalSafepointTime
258   (JNIEnv *env, jobject dummy)
259 {
260     return jmm_interface->GetLongAttribute(env, NULL,
261                                            JMM_TOTAL_STOPPED_TIME_MS);
262 }
263 
264 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getSafepointSyncTime(JNIEnv * env,jobject dummy)265 Java_sun_management_VMManagementImpl_getSafepointSyncTime
266   (JNIEnv *env, jobject dummy)
267 {
268     return jmm_interface->GetLongAttribute(env, NULL,
269                                            JMM_TOTAL_SAFEPOINTSYNC_TIME_MS);
270 }
271 
272 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getTotalApplicationNonStoppedTime(JNIEnv * env,jobject dummy)273 Java_sun_management_VMManagementImpl_getTotalApplicationNonStoppedTime
274   (JNIEnv *env, jobject dummy)
275 {
276     return jmm_interface->GetLongAttribute(env, NULL,
277                                            JMM_TOTAL_APP_TIME_MS);
278 }
279 
280 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getLoadedClassSize(JNIEnv * env,jobject dummy)281 Java_sun_management_VMManagementImpl_getLoadedClassSize
282   (JNIEnv *env, jobject dummy)
283 {
284     return jmm_interface->GetLongAttribute(env, NULL,
285                                            JMM_CLASS_LOADED_BYTES);
286 }
287 
288 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getUnloadedClassSize(JNIEnv * env,jobject dummy)289 Java_sun_management_VMManagementImpl_getUnloadedClassSize
290   (JNIEnv *env, jobject dummy)
291 {
292     return jmm_interface->GetLongAttribute(env, NULL,
293                                            JMM_CLASS_UNLOADED_BYTES);
294 }
295 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getClassLoadingTime(JNIEnv * env,jobject dummy)296 Java_sun_management_VMManagementImpl_getClassLoadingTime
297   (JNIEnv *env, jobject dummy)
298 {
299     return jmm_interface->GetLongAttribute(env, NULL,
300                                            JMM_TOTAL_CLASSLOAD_TIME_MS);
301 }
302 
303 
304 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getMethodDataSize(JNIEnv * env,jobject dummy)305 Java_sun_management_VMManagementImpl_getMethodDataSize
306   (JNIEnv *env, jobject dummy)
307 {
308     return jmm_interface->GetLongAttribute(env, NULL,
309                                            JMM_METHOD_DATA_SIZE_BYTES);
310 }
311 
312 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getInitializedClassCount(JNIEnv * env,jobject dummy)313 Java_sun_management_VMManagementImpl_getInitializedClassCount
314   (JNIEnv *env, jobject dummy)
315 {
316     return jmm_interface->GetLongAttribute(env, NULL,
317                                            JMM_CLASS_INIT_TOTAL_COUNT);
318 }
319 
320 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getClassInitializationTime(JNIEnv * env,jobject dummy)321 Java_sun_management_VMManagementImpl_getClassInitializationTime
322   (JNIEnv *env, jobject dummy)
323 {
324     return jmm_interface->GetLongAttribute(env, NULL,
325                                            JMM_CLASS_INIT_TOTAL_TIME_MS);
326 }
327 
328 JNIEXPORT jlong JNICALL
Java_sun_management_VMManagementImpl_getClassVerificationTime(JNIEnv * env,jobject dummy)329 Java_sun_management_VMManagementImpl_getClassVerificationTime
330   (JNIEnv *env, jobject dummy)
331 {
332     return jmm_interface->GetLongAttribute(env, NULL,
333                                            JMM_CLASS_VERIFY_TOTAL_TIME_MS);
334 }
335