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