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