src/share/vm/services/management.cpp

changeset 3329
3b688d6ff3d0
parent 2888
78542e2b5e35
child 3342
6c995c08526c
     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) {

mercurial