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
  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 
  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
  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
 112 Java_sun_management_VMManagementImpl_getVmArguments0
 113   (JNIEnv *env, jobject dummy)
 114 {
 115     return jmm_interface->GetInputArgumentArray(env);
 116 }
 117 
 118 JNIEXPORT jlong JNICALL
 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
 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
 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
 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
 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
 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
 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
 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
 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
 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 jboolean JNICALL
 204 Java_sun_management_VMManagementImpl_isThreadContentionMonitoringEnabled
 205   (JNIEnv *env, jobject dummy)
 206 {
 207     return jmm_interface->GetBoolAttribute(env,
 208                                            JMM_THREAD_CONTENTION_MONITORING);
 209 }
 210 
 211 JNIEXPORT jboolean JNICALL
 212 Java_sun_management_VMManagementImpl_isThreadCpuTimeEnabled
 213   (JNIEnv *env, jobject dummy)
 214 {
 215     return jmm_interface->GetBoolAttribute(env, JMM_THREAD_CPU_TIME);
 216 }
 217 
 218 JNIEXPORT jboolean JNICALL
 219 Java_sun_management_VMManagementImpl_isThreadAllocatedMemoryEnabled
 220   (JNIEnv *env, jobject dummy)
 221 {
 222     return jmm_interface->GetBoolAttribute(env, JMM_THREAD_ALLOCATED_MEMORY);
 223 }
 224 
 225 JNIEXPORT jint JNICALL
 226 Java_sun_management_VMManagementImpl_getProcessId
 227   (JNIEnv *env, jobject dummy)
 228 {
 229     jlong pid = jmm_interface->GetLongAttribute(env, NULL,
 230                                                 JMM_OS_PROCESS_ID);
 231     return (jint) pid;
 232 }
 233 
 234 JNIEXPORT jint JNICALL
 235 Java_sun_management_VMManagementImpl_getAvailableProcessors
 236   (JNIEnv *env, jobject dummy)
 237 {
 238     return JVM_ActiveProcessorCount();
 239 }
 240 
 241 JNIEXPORT jlong JNICALL
 242 Java_sun_management_VMManagementImpl_getSafepointCount
 243   (JNIEnv *env, jobject dummy)
 244 {
 245     return jmm_interface->GetLongAttribute(env, NULL,
 246                                            JMM_SAFEPOINT_COUNT);
 247 }
 248 
 249 JNIEXPORT jlong JNICALL
 250 Java_sun_management_VMManagementImpl_getTotalSafepointTime
 251   (JNIEnv *env, jobject dummy)
 252 {
 253     return jmm_interface->GetLongAttribute(env, NULL,
 254                                            JMM_TOTAL_STOPPED_TIME_MS);
 255 }
 256 
 257 JNIEXPORT jlong JNICALL
 258 Java_sun_management_VMManagementImpl_getSafepointSyncTime
 259   (JNIEnv *env, jobject dummy)
 260 {
 261     return jmm_interface->GetLongAttribute(env, NULL,
 262                                            JMM_TOTAL_SAFEPOINTSYNC_TIME_MS);
 263 }
 264 
 265 JNIEXPORT jlong JNICALL
 266 Java_sun_management_VMManagementImpl_getTotalApplicationNonStoppedTime
 267   (JNIEnv *env, jobject dummy)
 268 {
 269     return jmm_interface->GetLongAttribute(env, NULL,
 270                                            JMM_TOTAL_APP_TIME_MS);
 271 }
 272 
 273 JNIEXPORT jlong JNICALL
 274 Java_sun_management_VMManagementImpl_getLoadedClassSize
 275   (JNIEnv *env, jobject dummy)
 276 {
 277     return jmm_interface->GetLongAttribute(env, NULL,
 278                                            JMM_CLASS_LOADED_BYTES);
 279 }
 280 
 281 JNIEXPORT jlong JNICALL
 282 Java_sun_management_VMManagementImpl_getUnloadedClassSize
 283   (JNIEnv *env, jobject dummy)
 284 {
 285     return jmm_interface->GetLongAttribute(env, NULL,
 286                                            JMM_CLASS_UNLOADED_BYTES);
 287 }
 288 JNIEXPORT jlong JNICALL
 289 Java_sun_management_VMManagementImpl_getClassLoadingTime
 290   (JNIEnv *env, jobject dummy)
 291 {
 292     return jmm_interface->GetLongAttribute(env, NULL,
 293                                            JMM_TOTAL_CLASSLOAD_TIME_MS);
 294 }
 295 
 296 
 297 JNIEXPORT jlong JNICALL
 298 Java_sun_management_VMManagementImpl_getMethodDataSize
 299   (JNIEnv *env, jobject dummy)
 300 {
 301     return jmm_interface->GetLongAttribute(env, NULL,
 302                                            JMM_METHOD_DATA_SIZE_BYTES);
 303 }
 304 
 305 JNIEXPORT jlong JNICALL
 306 Java_sun_management_VMManagementImpl_getInitializedClassCount
 307   (JNIEnv *env, jobject dummy)
 308 {
 309     return jmm_interface->GetLongAttribute(env, NULL,
 310                                            JMM_CLASS_INIT_TOTAL_COUNT);
 311 }
 312 
 313 JNIEXPORT jlong JNICALL
 314 Java_sun_management_VMManagementImpl_getClassInitializationTime
 315   (JNIEnv *env, jobject dummy)
 316 {
 317     return jmm_interface->GetLongAttribute(env, NULL,
 318                                            JMM_CLASS_INIT_TOTAL_TIME_MS);
 319 }
 320 
 321 JNIEXPORT jlong JNICALL
 322 Java_sun_management_VMManagementImpl_getClassVerificationTime
 323   (JNIEnv *env, jobject dummy)
 324 {
 325     return jmm_interface->GetLongAttribute(env, NULL,
 326                                            JMM_CLASS_VERIFY_TOTAL_TIME_MS);
 327 }