src/share/vm/services/management.cpp

changeset 5047
31a4e55f8c9d
parent 4966
a527ddd44e07
child 5312
71963b3f802a
     1.1 --- a/src/share/vm/services/management.cpp	Wed May 01 09:00:39 2013 -0700
     1.2 +++ b/src/share/vm/services/management.cpp	Fri May 03 05:05:31 2013 -0700
     1.3 @@ -1,5 +1,5 @@
     1.4  /*
     1.5 - * Copyright (c) 2003, 2012, Oracle and/or its affiliates. All rights reserved.
     1.6 + * Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
     1.7   * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     1.8   *
     1.9   * This code is free software; you can redistribute it and/or modify it
    1.10 @@ -68,6 +68,9 @@
    1.11  Klass* Management::_managementFactory_klass = NULL;
    1.12  Klass* Management::_garbageCollectorImpl_klass = NULL;
    1.13  Klass* Management::_gcInfo_klass = NULL;
    1.14 +Klass* Management::_diagnosticCommandImpl_klass = NULL;
    1.15 +Klass* Management::_managementFactoryHelper_klass = NULL;
    1.16 +
    1.17  
    1.18  jmmOptionalSupport Management::_optional_support = {0};
    1.19  TimeStamp Management::_stamp;
    1.20 @@ -128,11 +131,14 @@
    1.21    _optional_support.isSynchronizerUsageSupported = 1;
    1.22  #endif // INCLUDE_SERVICES
    1.23    _optional_support.isThreadAllocatedMemorySupported = 1;
    1.24 +  _optional_support.isRemoteDiagnosticCommandsSupported = 1;
    1.25  
    1.26    // Registration of the diagnostic commands
    1.27    DCmdRegistrant::register_dcmds();
    1.28    DCmdRegistrant::register_dcmds_ext();
    1.29 -  DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<NMTDCmd>(true, false));
    1.30 +  uint32_t full_export = DCmd_Source_Internal | DCmd_Source_AttachAPI
    1.31 +                         | DCmd_Source_MBean;
    1.32 +  DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl<NMTDCmd>(full_export, true, false));
    1.33  }
    1.34  
    1.35  void Management::initialize(TRAPS) {
    1.36 @@ -262,6 +268,20 @@
    1.37    return _gcInfo_klass;
    1.38  }
    1.39  
    1.40 +Klass* Management::sun_management_DiagnosticCommandImpl_klass(TRAPS) {
    1.41 +  if (_diagnosticCommandImpl_klass == NULL) {
    1.42 +    _diagnosticCommandImpl_klass = load_and_initialize_klass(vmSymbols::sun_management_DiagnosticCommandImpl(), CHECK_NULL);
    1.43 +  }
    1.44 +  return _diagnosticCommandImpl_klass;
    1.45 +}
    1.46 +
    1.47 +Klass* Management::sun_management_ManagementFactoryHelper_klass(TRAPS) {
    1.48 +  if (_managementFactoryHelper_klass == NULL) {
    1.49 +    _managementFactoryHelper_klass = load_and_initialize_klass(vmSymbols::sun_management_ManagementFactoryHelper(), CHECK_NULL);
    1.50 +  }
    1.51 +  return _managementFactoryHelper_klass;
    1.52 +}
    1.53 +
    1.54  static void initialize_ThreadInfo_constructor_arguments(JavaCallArguments* args, ThreadSnapshot* snapshot, TRAPS) {
    1.55    Handle snapshot_thread(THREAD, snapshot->threadObj());
    1.56  
    1.57 @@ -2144,7 +2164,7 @@
    1.58  
    1.59  JVM_ENTRY(jobjectArray, jmm_GetDiagnosticCommands(JNIEnv *env))
    1.60    ResourceMark rm(THREAD);
    1.61 -  GrowableArray<const char *>* dcmd_list = DCmdFactory::DCmd_list();
    1.62 +  GrowableArray<const char *>* dcmd_list = DCmdFactory::DCmd_list(DCmd_Source_MBean);
    1.63    objArrayOop cmd_array_oop = oopFactory::new_objArray(SystemDictionary::String_klass(),
    1.64            dcmd_list->length(), CHECK_NULL);
    1.65    objArrayHandle cmd_array(THREAD, cmd_array_oop);
    1.66 @@ -2173,7 +2193,7 @@
    1.67                 "Array element type is not String class");
    1.68    }
    1.69  
    1.70 -  GrowableArray<DCmdInfo *>* info_list = DCmdFactory::DCmdInfo_list();
    1.71 +  GrowableArray<DCmdInfo *>* info_list = DCmdFactory::DCmdInfo_list(DCmd_Source_MBean);
    1.72  
    1.73    int num_cmds = cmds_ah->length();
    1.74    for (int i = 0; i < num_cmds; i++) {
    1.75 @@ -2196,6 +2216,10 @@
    1.76      infoArray[i].name = info->name();
    1.77      infoArray[i].description = info->description();
    1.78      infoArray[i].impact = info->impact();
    1.79 +    JavaPermission p = info->permission();
    1.80 +    infoArray[i].permission_class = p._class;
    1.81 +    infoArray[i].permission_name = p._name;
    1.82 +    infoArray[i].permission_action = p._action;
    1.83      infoArray[i].num_arguments = info->num_arguments();
    1.84      infoArray[i].enabled = info->is_enabled();
    1.85    }
    1.86 @@ -2215,7 +2239,8 @@
    1.87                "Command line content cannot be null.");
    1.88    }
    1.89    DCmd* dcmd = NULL;
    1.90 -  DCmdFactory*factory = DCmdFactory::factory(cmd_name, strlen(cmd_name));
    1.91 +  DCmdFactory*factory = DCmdFactory::factory(DCmd_Source_MBean, cmd_name,
    1.92 +                                             strlen(cmd_name));
    1.93    if (factory != NULL) {
    1.94      dcmd = factory->create_resource_instance(NULL);
    1.95    }
    1.96 @@ -2235,6 +2260,7 @@
    1.97      infoArray[i].default_string = array->at(i)->default_string();
    1.98      infoArray[i].mandatory = array->at(i)->is_mandatory();
    1.99      infoArray[i].option = array->at(i)->is_option();
   1.100 +    infoArray[i].multiple = array->at(i)->is_multiple();
   1.101      infoArray[i].position = array->at(i)->position();
   1.102    }
   1.103    return;
   1.104 @@ -2253,11 +2279,15 @@
   1.105                     "Command line content cannot be null.");
   1.106    }
   1.107    bufferedStream output;
   1.108 -  DCmd::parse_and_execute(&output, cmdline, ' ', CHECK_NULL);
   1.109 +  DCmd::parse_and_execute(DCmd_Source_MBean, &output, cmdline, ' ', CHECK_NULL);
   1.110    oop result = java_lang_String::create_oop_from_str(output.as_string(), CHECK_NULL);
   1.111    return (jstring) JNIHandles::make_local(env, result);
   1.112  JVM_END
   1.113  
   1.114 +JVM_ENTRY(void, jmm_SetDiagnosticFrameworkNotificationEnabled(JNIEnv *env, jboolean enabled))
   1.115 +  DCmdFactory::set_jmx_notification_enabled(enabled?true:false);
   1.116 +JVM_END
   1.117 +
   1.118  jlong Management::ticks_to_ms(jlong ticks) {
   1.119    assert(os::elapsed_frequency() > 0, "Must be non-zero");
   1.120    return (jlong)(((double)ticks / (double)os::elapsed_frequency())
   1.121 @@ -2304,7 +2334,8 @@
   1.122    jmm_GetDiagnosticCommands,
   1.123    jmm_GetDiagnosticCommandInfo,
   1.124    jmm_GetDiagnosticCommandArgumentsInfo,
   1.125 -  jmm_ExecuteDiagnosticCommand
   1.126 +  jmm_ExecuteDiagnosticCommand,
   1.127 +  jmm_SetDiagnosticFrameworkNotificationEnabled
   1.128  };
   1.129  #endif // INCLUDE_MANAGEMENT
   1.130  

mercurial