src/share/native/sun/management/HotSpotDiagnostic.c

Print this page


   1 /*
   2  * Copyright (c) 2005, 2006, 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_HotSpotDiagnostic.h"
  30 
  31 JNIEXPORT void JNICALL
  32 Java_sun_management_HotSpotDiagnostic_dumpHeap
  33   (JNIEnv *env, jobject dummy, jstring outputfile, jboolean live)
  34 {
  35     jmm_interface->DumpHeap0(env, outputfile, live);










































































































































  36 }
   1 /*
   2  * Copyright (c) 2005, 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_HotSpotDiagnostic.h"
  30 
  31 JNIEXPORT void JNICALL
  32 Java_sun_management_HotSpotDiagnostic_dumpHeap
  33   (JNIEnv *env, jobject dummy, jstring outputfile, jboolean live)
  34 {
  35     jmm_interface->DumpHeap0(env, outputfile, live);
  36 }
  37 
  38 JNIEXPORT jobjectArray JNICALL
  39 Java_sun_management_HotSpotDiagnostic_getDiagnosticCommands0
  40   (JNIEnv *env, jobject dummy)
  41 {
  42   if((jmm_version > JMM_VERSION_1_2_1)
  43      || (jmm_version == JMM_VERSION_1_2 && ((jmm_version&0xFF)>=2))) {
  44       return jmm_interface->GetDiagnosticCommands(env);
  45   }
  46   JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
  47                   "Diagnostic commands are not supported by this VM");
  48 }
  49 
  50 jobject getDiagnosticCommandArgumentInfoArray(JNIEnv *env, jstring command,
  51                                                    int num_arg) {
  52   int i;
  53   jobject obj;
  54   jobjectArray result;
  55   dcmdArgInfo* dcmd_arg_info_array;
  56   jclass dcmdArgInfoCls;
  57   jclass arraysCls;
  58   jmethodID mid;
  59   jobject resultList;
  60 
  61   dcmd_arg_info_array = (dcmdArgInfo*) malloc(num_arg * sizeof(dcmdArgInfo));
  62   if (dcmd_arg_info_array == NULL) {
  63     return NULL;
  64   }
  65   jmm_interface->GetDiagnosticCommandArgumentsInfo(env, command,
  66                                                    dcmd_arg_info_array);
  67   dcmdArgInfoCls = (*env)->FindClass(env,
  68                                      "com/sun/management/DiagnosticCommandArgumentInfo");
  69   result = (*env)->NewObjectArray(env, num_arg, dcmdArgInfoCls, NULL);
  70   if (result == NULL) {
  71     free(dcmd_arg_info_array);
  72     return NULL;
  73   }
  74   for (i=0; i<num_arg; i++) {
  75     obj = JNU_NewObjectByName(env,
  76                               "com/sun/management/DiagnosticCommandArgumentInfo",
  77                               "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZI)V",
  78                               (*env)->NewStringUTF(env,dcmd_arg_info_array[i].name),
  79                               (*env)->NewStringUTF(env,dcmd_arg_info_array[i].description),
  80                               (*env)->NewStringUTF(env,dcmd_arg_info_array[i].type),
  81                               dcmd_arg_info_array[i].default_string == NULL ? NULL:
  82                               (*env)->NewStringUTF(env, dcmd_arg_info_array[i].default_string),
  83                               dcmd_arg_info_array[i].mandatory,
  84                               dcmd_arg_info_array[i].option,
  85                               dcmd_arg_info_array[i].position);
  86     if (obj == NULL) {
  87       free(dcmd_arg_info_array);
  88       return NULL;
  89     }
  90     (*env)->SetObjectArrayElement(env, result, i, obj);
  91   }
  92   free(dcmd_arg_info_array);
  93   arraysCls = (*env)->FindClass(env, "java/util/Arrays");
  94   mid = (*env)->GetStaticMethodID(env, arraysCls,
  95                                   "asList", "([Ljava/lang/Object;)Ljava/util/List;");
  96   resultList = (*env)->CallStaticObjectMethod(env, arraysCls, mid, result);
  97   return resultList;
  98 }
  99 
 100 /* Throws IllegalArgumentException if at least one the diagnostic command
 101  * passed in argument is not supported by the JVM
 102  */
 103 JNIEXPORT jobjectArray JNICALL
 104 Java_sun_management_HotSpotDiagnostic_getDiagnosticCommandInfo0
 105 (JNIEnv *env, jobject dummy, jobjectArray commands)
 106 {
 107   int i;
 108   jclass dcmdInfoCls;
 109   jobject result;
 110   jobjectArray args;
 111   jobject obj;
 112 
 113   if (commands == NULL) {
 114     JNU_ThrowNullPointerException(env, "Invalid String Array");
 115     return NULL;
 116   }
 117   if ((jmm_version > JMM_VERSION_1_2_1)
 118       || (jmm_version == JMM_VERSION_1_2 && ((jmm_version&0xFF)>=2))) {
 119     jsize num_commands = (*env)->GetArrayLength(env, commands);
 120     dcmdInfo* dcmd_info_array = (dcmdInfo*) malloc(num_commands *
 121                                                    sizeof(dcmdInfo));
 122     if (dcmd_info_array == NULL) {
 123       JNU_ThrowOutOfMemoryError(env, NULL);
 124     }
 125     jmm_interface->GetDiagnosticCommandInfo(env, commands, dcmd_info_array);
 126     dcmdInfoCls = (*env)->FindClass(env,
 127                                     "com/sun/management/DiagnosticCommandInfo");
 128     result = (*env)->NewObjectArray(env, num_commands, dcmdInfoCls, NULL);
 129     if (result == NULL) {
 130       free(dcmd_info_array);
 131       JNU_ThrowOutOfMemoryError(env, 0);
 132     }
 133     for (i=0; i<num_commands; i++) {
 134       args = getDiagnosticCommandArgumentInfoArray(env,
 135                                                    (*env)->GetObjectArrayElement(env,commands,i),
 136                                                    dcmd_info_array[i].num_arguments);
 137       if (args == NULL) {
 138         free(dcmd_info_array);
 139         JNU_ThrowOutOfMemoryError(env, 0);
 140       }
 141       obj = JNU_NewObjectByName(env,
 142                                 "com/sun/management/DiagnosticCommandInfo",
 143                                 "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/util/List;)V",
 144                                 (*env)->NewStringUTF(env,dcmd_info_array[i].name),
 145                                 (*env)->NewStringUTF(env,dcmd_info_array[i].description),
 146                                 (*env)->NewStringUTF(env,dcmd_info_array[i].impact),
 147                                 dcmd_info_array[i].enabled,
 148                                 args);
 149       if (obj == NULL) {
 150         free(dcmd_info_array);
 151         JNU_ThrowOutOfMemoryError(env, 0);
 152       }
 153       (*env)->SetObjectArrayElement(env, result, i, obj);
 154     }
 155     free(dcmd_info_array);
 156     return result;
 157   }
 158   JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 159                   "Diagnostic commands are not supported by this VM");
 160 }
 161 
 162 /* Throws IllegalArgumentException if the diagnostic command
 163  * passed in argument is not supported by the JVM
 164  */
 165 JNIEXPORT jstring JNICALL
 166 Java_sun_management_HotSpotDiagnostic_executeDiagnosticCommand0
 167 (JNIEnv *env, jobject dummy, jstring command) {
 168   if((jmm_version > JMM_VERSION_1_2_1 )
 169      || (jmm_version == JMM_VERSION_1_2 && ((jmm_version&0xFF)>=2))) {
 170       return jmm_interface->ExecuteDiagnosticCommand(env, command);
 171   }
 172   JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 173                   "Diagnostic commands are not supported by this VM");
 174 }