Path: blob/aarch64-shenandoah-jdk8u272-b10/jdk/src/share/native/sun/management/DiagnosticCommandImpl.c
38829 views
/*1* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation. Oracle designates this7* particular file as subject to the "Classpath" exception as provided8* by Oracle in the LICENSE file that accompanied this code.9*10* This code is distributed in the hope that it will be useful, but WITHOUT11* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or12* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License13* version 2 for more details (a copy is included in the LICENSE file that14* accompanied this code).15*16* You should have received a copy of the GNU General Public License version17* 2 along with this work; if not, write to the Free Software Foundation,18* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.19*20* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA21* or visit www.oracle.com if you need additional information or have any22* questions.23*/2425#include <stdlib.h>26#include <jni.h>27#include "management.h"28#include "sun_management_DiagnosticCommandImpl.h"2930JNIEXPORT void JNICALL Java_sun_management_DiagnosticCommandImpl_setNotificationEnabled31(JNIEnv *env, jobject dummy, jboolean enabled) {32if (jmm_version <= JMM_VERSION_1_2_2) {33JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",34"JMX interface to diagnostic framework notifications is not supported by this VM");35return;36}37jmm_interface->SetDiagnosticFrameworkNotificationEnabled(env, enabled);38}3940JNIEXPORT jobjectArray JNICALL41Java_sun_management_DiagnosticCommandImpl_getDiagnosticCommands42(JNIEnv *env, jobject dummy)43{44return jmm_interface->GetDiagnosticCommands(env);45}4647jobject getDiagnosticCommandArgumentInfoArray(JNIEnv *env, jstring command,48int num_arg) {49int i;50jobject obj;51jobjectArray result;52dcmdArgInfo* dcmd_arg_info_array;53jclass dcmdArgInfoCls;54jclass arraysCls;55jmethodID mid;56jobject resultList;5758dcmd_arg_info_array = (dcmdArgInfo*) malloc(num_arg * sizeof(dcmdArgInfo));59/* According to ISO C it is perfectly legal for malloc to return zero if called with a zero argument */60if (dcmd_arg_info_array == NULL && num_arg != 0) {61return NULL;62}63jmm_interface->GetDiagnosticCommandArgumentsInfo(env, command,64dcmd_arg_info_array);65dcmdArgInfoCls = (*env)->FindClass(env,66"sun/management/DiagnosticCommandArgumentInfo");67result = (*env)->NewObjectArray(env, num_arg, dcmdArgInfoCls, NULL);68if (result == NULL) {69free(dcmd_arg_info_array);70return NULL;71}72for (i=0; i<num_arg; i++) {73obj = JNU_NewObjectByName(env,74"sun/management/DiagnosticCommandArgumentInfo",75"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZZZI)V",76(*env)->NewStringUTF(env,dcmd_arg_info_array[i].name),77(*env)->NewStringUTF(env,dcmd_arg_info_array[i].description),78(*env)->NewStringUTF(env,dcmd_arg_info_array[i].type),79dcmd_arg_info_array[i].default_string == NULL ? NULL:80(*env)->NewStringUTF(env, dcmd_arg_info_array[i].default_string),81dcmd_arg_info_array[i].mandatory,82dcmd_arg_info_array[i].option,83dcmd_arg_info_array[i].multiple,84dcmd_arg_info_array[i].position);85if (obj == NULL) {86free(dcmd_arg_info_array);87return NULL;88}89(*env)->SetObjectArrayElement(env, result, i, obj);90}91free(dcmd_arg_info_array);92arraysCls = (*env)->FindClass(env, "java/util/Arrays");93mid = (*env)->GetStaticMethodID(env, arraysCls,94"asList", "([Ljava/lang/Object;)Ljava/util/List;");95resultList = (*env)->CallStaticObjectMethod(env, arraysCls, mid, result);96return resultList;97}9899/* Throws IllegalArgumentException if at least one of the diagnostic command100* passed in argument is not supported by the JVM101*/102JNIEXPORT jobjectArray JNICALL103Java_sun_management_DiagnosticCommandImpl_getDiagnosticCommandInfo104(JNIEnv *env, jobject dummy, jobjectArray commands)105{106int i;107jclass dcmdInfoCls;108jobject result;109jobjectArray args;110jobject obj;111jmmOptionalSupport mos;112jint ret = jmm_interface->GetOptionalSupport(env, &mos);113jsize num_commands;114dcmdInfo* dcmd_info_array;115116if (commands == NULL) {117JNU_ThrowNullPointerException(env, "Invalid String Array");118return NULL;119}120num_commands = (*env)->GetArrayLength(env, commands);121dcmdInfoCls = (*env)->FindClass(env,122"sun/management/DiagnosticCommandInfo");123result = (*env)->NewObjectArray(env, num_commands, dcmdInfoCls, NULL);124if (result == NULL) {125JNU_ThrowOutOfMemoryError(env, 0);126return NULL;127}128if (num_commands == 0) {129/* Handle the 'zero commands' case specially to avoid calling 'malloc()' */130/* with a zero argument because that may legally return a NULL pointer. */131return result;132}133dcmd_info_array = (dcmdInfo*) malloc(num_commands * sizeof(dcmdInfo));134if (dcmd_info_array == NULL) {135JNU_ThrowOutOfMemoryError(env, NULL);136return NULL;137}138jmm_interface->GetDiagnosticCommandInfo(env, commands, dcmd_info_array);139for (i=0; i<num_commands; i++) {140args = getDiagnosticCommandArgumentInfoArray(env,141(*env)->GetObjectArrayElement(env,commands,i),142dcmd_info_array[i].num_arguments);143if (args == NULL) {144free(dcmd_info_array);145JNU_ThrowOutOfMemoryError(env, 0);146return NULL;147}148obj = JNU_NewObjectByName(env,149"sun/management/DiagnosticCommandInfo",150"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLjava/util/List;)V",151(*env)->NewStringUTF(env,dcmd_info_array[i].name),152(*env)->NewStringUTF(env,dcmd_info_array[i].description),153(*env)->NewStringUTF(env,dcmd_info_array[i].impact),154dcmd_info_array[i].permission_class==NULL?NULL:(*env)->NewStringUTF(env,dcmd_info_array[i].permission_class),155dcmd_info_array[i].permission_name==NULL?NULL:(*env)->NewStringUTF(env,dcmd_info_array[i].permission_name),156dcmd_info_array[i].permission_action==NULL?NULL:(*env)->NewStringUTF(env,dcmd_info_array[i].permission_action),157dcmd_info_array[i].enabled,158args);159if (obj == NULL) {160free(dcmd_info_array);161JNU_ThrowOutOfMemoryError(env, 0);162return NULL;163}164(*env)->SetObjectArrayElement(env, result, i, obj);165}166free(dcmd_info_array);167return result;168}169170/* Throws IllegalArgumentException if the diagnostic command171* passed in argument is not supported by the JVM172*/173JNIEXPORT jstring JNICALL174Java_sun_management_DiagnosticCommandImpl_executeDiagnosticCommand175(JNIEnv *env, jobject dummy, jstring command) {176return jmm_interface->ExecuteDiagnosticCommand(env, command);177}178179180