/* * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * This code is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License version 2 only, as * published by the Free Software Foundation. Oracle designates this * particular file as subject to the "Classpath" exception as provided * by Oracle in the LICENSE file that accompanied this code. * * This code is distributed in the hope that it will be useful, but WITHOUT * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License * version 2 for more details (a copy is included in the LICENSE file that * accompanied this code). * * You should have received a copy of the GNU General Public License version * 2 along with this work; if not, write to the Free Software Foundation, * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. * * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA * or visit www.oracle.com if you need additional information or have any * questions. */ #include #include #include #include #include "management_ext.h" #include "com_sun_management_internal_Flag.h" static jobject default_origin = NULL; static jobject vm_creation_origin = NULL; static jobject mgmt_origin = NULL; static jobject envvar_origin = NULL; static jobject config_file_origin = NULL; static jobject ergo_origin = NULL; static jobject attach_origin = NULL; static jobject other_origin = NULL; JNIEXPORT jint JNICALL Java_com_sun_management_internal_Flag_getInternalFlagCount (JNIEnv *env, jclass cls) { jlong count = jmm_interface->GetLongAttribute(env, NULL, JMM_VM_GLOBAL_COUNT); return (jint) count; } JNIEXPORT jobjectArray JNICALL Java_com_sun_management_internal_Flag_getAllFlagNames (JNIEnv *env, jclass cls) { return jmm_interface->GetVMGlobalNames(env); } static jobject find_origin_constant(JNIEnv* env, const char* enum_name) { jvalue field; field = JNU_GetStaticFieldByName(env, NULL, "com/sun/management/VMOption$Origin", enum_name, "Lcom/sun/management/VMOption$Origin;"); return (*env)->NewGlobalRef(env, field.l); } JNIEXPORT void JNICALL Java_com_sun_management_internal_Flag_initialize (JNIEnv *env, jclass cls) { default_origin = find_origin_constant(env, "DEFAULT"); vm_creation_origin = find_origin_constant(env, "VM_CREATION"); mgmt_origin = find_origin_constant(env, "MANAGEMENT"); envvar_origin = find_origin_constant(env, "ENVIRON_VAR"); config_file_origin = find_origin_constant(env, "CONFIG_FILE"); ergo_origin = find_origin_constant(env, "ERGONOMIC"); attach_origin = find_origin_constant(env, "ATTACH_ON_DEMAND"); other_origin = find_origin_constant(env, "OTHER"); } JNIEXPORT jint JNICALL Java_com_sun_management_internal_Flag_getFlags (JNIEnv *env, jclass cls, jobjectArray names, jobjectArray flags, jint count) { jint num_flags, i, index; jmmVMGlobal* globals; size_t gsize; const char* class_name = "com/sun/management/internal/Flag"; const char* signature = "(Ljava/lang/String;Ljava/lang/Object;ZZLcom/sun/management/VMOption$Origin;)V"; jobject origin; jobject valueObj; jobject flag; if (flags == NULL) { JNU_ThrowNullPointerException(env, 0); return 0; } if (count <= 0) { JNU_ThrowIllegalArgumentException(env, 0); return 0; } gsize = (size_t)count * sizeof(jmmVMGlobal); globals = (jmmVMGlobal*) malloc(gsize); if (globals == NULL) { JNU_ThrowOutOfMemoryError(env, 0); return 0; } memset(globals, 0, gsize); num_flags = jmm_interface->GetVMGlobals(env, names, globals, count); if (num_flags == 0) { free(globals); return 0; } index = 0; for (i = 0; i < count; i++) { if (globals[i].name == NULL) { continue; } switch (globals[i].type) { case JMM_VMGLOBAL_TYPE_JBOOLEAN: valueObj = JNU_NewObjectByName(env, "java/lang/Boolean", "(Z)V", globals[i].value.z); break; case JMM_VMGLOBAL_TYPE_JSTRING: valueObj = globals[i].value.l; break; case JMM_VMGLOBAL_TYPE_JLONG: valueObj = JNU_NewObjectByName(env, "java/lang/Long", "(J)V", globals[i].value.j); break; case JMM_VMGLOBAL_TYPE_JDOUBLE: valueObj = JNU_NewObjectByName(env, "java/lang/Double", "(D)V", globals[i].value.d); break; default: // ignore unsupported type continue; } switch (globals[i].origin) { case JMM_VMGLOBAL_ORIGIN_DEFAULT: origin = default_origin; break; case JMM_VMGLOBAL_ORIGIN_COMMAND_LINE: origin = vm_creation_origin; break; case JMM_VMGLOBAL_ORIGIN_MANAGEMENT: origin = mgmt_origin; break; case JMM_VMGLOBAL_ORIGIN_ENVIRON_VAR: origin = envvar_origin; break; case JMM_VMGLOBAL_ORIGIN_CONFIG_FILE: origin = config_file_origin; break; case JMM_VMGLOBAL_ORIGIN_ERGONOMIC: origin = ergo_origin; break; case JMM_VMGLOBAL_ORIGIN_ATTACH_ON_DEMAND: origin = attach_origin; break; case JMM_VMGLOBAL_ORIGIN_OTHER: origin = other_origin; break; default: // unknown origin origin = other_origin; break; } flag = JNU_NewObjectByName(env, class_name, signature, globals[i].name, valueObj, globals[i].writeable, globals[i].external, origin); if (flag == NULL) { free(globals); JNU_ThrowOutOfMemoryError(env, 0); return 0; } (*env)->SetObjectArrayElement(env, flags, index, flag); index++; } if (index != num_flags) { JNU_ThrowInternalError(env, "Number of Flag objects created unmatched"); free(globals); return 0; } free(globals); /* return the number of Flag objects created */ return num_flags; } JNIEXPORT void JNICALL Java_com_sun_management_internal_Flag_setLongValue (JNIEnv *env, jclass cls, jstring name, jlong value) { jvalue v; v.j = value; jmm_interface->SetVMGlobal(env, name, v); } JNIEXPORT void JNICALL Java_com_sun_management_internal_Flag_setDoubleValue (JNIEnv *env, jclass cls, jstring name, jdouble value) { jvalue v; v.d = value; jmm_interface->SetVMGlobal(env, name, v); } JNIEXPORT void JNICALL Java_com_sun_management_internal_Flag_setBooleanValue (JNIEnv *env, jclass cls, jstring name, jboolean value) { jvalue v; v.z = value; jmm_interface->SetVMGlobal(env, name, v); } JNIEXPORT void JNICALL Java_com_sun_management_internal_Flag_setStringValue (JNIEnv *env, jclass cls, jstring name, jstring value) { jvalue v; v.l = value; jmm_interface->SetVMGlobal(env, name, v); }