1.1 --- a/src/share/vm/services/management.cpp Fri Dec 09 06:46:57 2011 -0800 1.2 +++ b/src/share/vm/services/management.cpp Wed Dec 14 04:30:57 2011 -0800 1.3 @@ -40,7 +40,10 @@ 1.4 #include "runtime/os.hpp" 1.5 #include "runtime/serviceThread.hpp" 1.6 #include "services/classLoadingService.hpp" 1.7 +#include "services/diagnosticCommand.hpp" 1.8 +#include "services/diagnosticFramework.hpp" 1.9 #include "services/heapDumper.hpp" 1.10 +#include "services/jmm.h" 1.11 #include "services/lowMemoryDetector.hpp" 1.12 #include "services/gcNotifier.hpp" 1.13 #include "services/management.hpp" 1.14 @@ -113,6 +116,9 @@ 1.15 _optional_support.isSynchronizerUsageSupported = 1; 1.16 #endif // SERVICES_KERNEL 1.17 _optional_support.isThreadAllocatedMemorySupported = 1; 1.18 + 1.19 + DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<HelpDCmd>(true, false)); 1.20 + DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<VersionDCmd>(true, false)); 1.21 } 1.22 1.23 void Management::initialize(TRAPS) { 1.24 @@ -2107,6 +2113,122 @@ 1.25 #endif // SERVICES_KERNEL 1.26 JVM_END 1.27 1.28 +JVM_ENTRY(jobjectArray, jmm_GetDiagnosticCommands(JNIEnv *env)) 1.29 + ResourceMark rm(THREAD); 1.30 + GrowableArray<const char *>* dcmd_list = DCmdFactory::DCmd_list(); 1.31 + objArrayOop cmd_array_oop = oopFactory::new_objArray(SystemDictionary::String_klass(), 1.32 + dcmd_list->length(), CHECK_NULL); 1.33 + objArrayHandle cmd_array(THREAD, cmd_array_oop); 1.34 + for (int i = 0; i < dcmd_list->length(); i++) { 1.35 + oop cmd_name = java_lang_String::create_oop_from_str(dcmd_list->at(i), CHECK_NULL); 1.36 + cmd_array->obj_at_put(i, cmd_name); 1.37 + } 1.38 + return (jobjectArray) JNIHandles::make_local(env, cmd_array()); 1.39 +JVM_END 1.40 + 1.41 +JVM_ENTRY(void, jmm_GetDiagnosticCommandInfo(JNIEnv *env, jobjectArray cmds, 1.42 + dcmdInfo* infoArray)) 1.43 + if (cmds == NULL || infoArray == NULL) { 1.44 + THROW(vmSymbols::java_lang_NullPointerException()); 1.45 + } 1.46 + 1.47 + ResourceMark rm(THREAD); 1.48 + 1.49 + objArrayOop ca = objArrayOop(JNIHandles::resolve_non_null(cmds)); 1.50 + objArrayHandle cmds_ah(THREAD, ca); 1.51 + 1.52 + // Make sure we have a String array 1.53 + klassOop element_klass = objArrayKlass::cast(cmds_ah->klass())->element_klass(); 1.54 + if (element_klass != SystemDictionary::String_klass()) { 1.55 + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 1.56 + "Array element type is not String class"); 1.57 + } 1.58 + 1.59 + GrowableArray<DCmdInfo *>* info_list = DCmdFactory::DCmdInfo_list(); 1.60 + 1.61 + int num_cmds = cmds_ah->length(); 1.62 + for (int i = 0; i < num_cmds; i++) { 1.63 + oop cmd = cmds_ah->obj_at(i); 1.64 + if (cmd == NULL) { 1.65 + THROW_MSG(vmSymbols::java_lang_NullPointerException(), 1.66 + "Command name cannot be null."); 1.67 + } 1.68 + char* cmd_name = java_lang_String::as_utf8_string(cmd); 1.69 + if (cmd_name == NULL) { 1.70 + THROW_MSG(vmSymbols::java_lang_NullPointerException(), 1.71 + "Command name cannot be null."); 1.72 + } 1.73 + int pos = info_list->find((void*)cmd_name,DCmdInfo::by_name); 1.74 + if (pos == -1) { 1.75 + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 1.76 + "Unknown diagnostic command"); 1.77 + } 1.78 + DCmdInfo* info = info_list->at(pos); 1.79 + infoArray[i].name = info->name(); 1.80 + infoArray[i].description = info->description(); 1.81 + infoArray[i].impact = info->impact(); 1.82 + infoArray[i].num_arguments = info->num_arguments(); 1.83 + infoArray[i].enabled = info->is_enabled(); 1.84 + } 1.85 +JVM_END 1.86 + 1.87 +JVM_ENTRY(void, jmm_GetDiagnosticCommandArgumentsInfo(JNIEnv *env, 1.88 + jstring command, dcmdArgInfo* infoArray)) 1.89 + ResourceMark rm(THREAD); 1.90 + oop cmd = JNIHandles::resolve_external_guard(command); 1.91 + if (cmd == NULL) { 1.92 + THROW_MSG(vmSymbols::java_lang_NullPointerException(), 1.93 + "Command line cannot be null."); 1.94 + } 1.95 + char* cmd_name = java_lang_String::as_utf8_string(cmd); 1.96 + if (cmd_name == NULL) { 1.97 + THROW_MSG(vmSymbols::java_lang_NullPointerException(), 1.98 + "Command line content cannot be null."); 1.99 + } 1.100 + DCmd* dcmd = NULL; 1.101 + DCmdFactory*factory = DCmdFactory::factory(cmd_name, strlen(cmd_name)); 1.102 + if (factory != NULL) { 1.103 + dcmd = factory->create_resource_instance(NULL); 1.104 + } 1.105 + if (dcmd == NULL) { 1.106 + THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(), 1.107 + "Unknown diagnostic command"); 1.108 + } 1.109 + DCmdMark mark(dcmd); 1.110 + GrowableArray<DCmdArgumentInfo*>* array = dcmd->argument_info_array(); 1.111 + if (array->length() == 0) { 1.112 + return; 1.113 + } 1.114 + for (int i = 0; i < array->length(); i++) { 1.115 + infoArray[i].name = array->at(i)->name(); 1.116 + infoArray[i].description = array->at(i)->description(); 1.117 + infoArray[i].type = array->at(i)->type(); 1.118 + infoArray[i].default_string = array->at(i)->default_string(); 1.119 + infoArray[i].mandatory = array->at(i)->is_mandatory(); 1.120 + infoArray[i].option = array->at(i)->is_option(); 1.121 + infoArray[i].position = array->at(i)->position(); 1.122 + } 1.123 + return; 1.124 +JVM_END 1.125 + 1.126 +JVM_ENTRY(jstring, jmm_ExecuteDiagnosticCommand(JNIEnv *env, jstring commandline)) 1.127 + ResourceMark rm(THREAD); 1.128 + oop cmd = JNIHandles::resolve_external_guard(commandline); 1.129 + if (cmd == NULL) { 1.130 + THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(), 1.131 + "Command line cannot be null."); 1.132 + } 1.133 + char* cmdline = java_lang_String::as_utf8_string(cmd); 1.134 + if (cmdline == NULL) { 1.135 + THROW_MSG_NULL(vmSymbols::java_lang_NullPointerException(), 1.136 + "Command line content cannot be null."); 1.137 + } 1.138 + bufferedStream output; 1.139 + DCmd::parse_and_execute(&output, cmdline, ' ', CHECK_NULL); 1.140 + oop result = java_lang_String::create_oop_from_str(output.as_string(), CHECK_NULL); 1.141 + return (jstring) JNIHandles::make_local(env, result); 1.142 +JVM_END 1.143 + 1.144 jlong Management::ticks_to_ms(jlong ticks) { 1.145 assert(os::elapsed_frequency() > 0, "Must be non-zero"); 1.146 return (jlong)(((double)ticks / (double)os::elapsed_frequency()) 1.147 @@ -2149,7 +2271,11 @@ 1.148 jmm_SetVMGlobal, 1.149 NULL, 1.150 jmm_DumpThreads, 1.151 - jmm_SetGCNotificationEnabled 1.152 + jmm_SetGCNotificationEnabled, 1.153 + jmm_GetDiagnosticCommands, 1.154 + jmm_GetDiagnosticCommandInfo, 1.155 + jmm_GetDiagnosticCommandArgumentsInfo, 1.156 + jmm_ExecuteDiagnosticCommand 1.157 }; 1.158 1.159 void* Management::get_jmm_interface(int version) {