diff --git a/src/share/vm/jfr/dcmd/jfrDcmds.cpp b/src/share/vm/jfr/dcmd/jfrDcmds.cpp index 67358b6b6a66fa632b1b8ad821d0ec83f5736922..293cb2b3e4bdc28e19a13d55731bc267daa1ae61 100644 --- a/src/share/vm/jfr/dcmd/jfrDcmds.cpp +++ b/src/share/vm/jfr/dcmd/jfrDcmds.cpp @@ -626,6 +626,7 @@ bool register_jfr_dcmds() { DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false)); DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false)); DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false)); + DCmdFactory::register_DCmdFactory(new DCmdFactoryImpl(full_export, true, false)); return true; } diff --git a/src/share/vm/jfr/dcmd/jfrDcmds.hpp b/src/share/vm/jfr/dcmd/jfrDcmds.hpp index 857772d3b06886464f08a40b6016ee7a9c137e4e..035179cbd6332a843170b7d0596e021b15d61c68 100644 --- a/src/share/vm/jfr/dcmd/jfrDcmds.hpp +++ b/src/share/vm/jfr/dcmd/jfrDcmds.hpp @@ -166,6 +166,25 @@ class JfrConfigureFlightRecorderDCmd : public DCmdWithParser { virtual void execute(DCmdSource source, TRAPS); }; +class JfrUnlockCommercialFeaturesDCmd : public DCmd { +public: + JfrUnlockCommercialFeaturesDCmd(outputStream* output, bool heap) : DCmd(output, heap) { } + static const char* name() { return "VM.unlock_commercial_features"; } + static const char* description() { + return "Simulate commercial features unlocking for Alibaba Dragonwell8."; + } + static const char* impact() { return "Low"; } + static const JavaPermission permission() { + JavaPermission p = {"java.lang.management.ManagementPermission", + "monitor", NULL}; + return p; + } + static int num_arguments() { return 0; } + virtual void execute(DCmdSource source, TRAPS) { + UnlockCommercialFeatures = true; + } +}; + bool register_jfr_dcmds(); #endif // SHARE_VM_JFR_JFRDCMDS_HPP diff --git a/src/share/vm/runtime/globals.hpp b/src/share/vm/runtime/globals.hpp index 2ed1e013f198e403174722374b91a44932cdc82c..e260934aa4def23e5f10e51fa6fae19b911e6ee1 100644 --- a/src/share/vm/runtime/globals.hpp +++ b/src/share/vm/runtime/globals.hpp @@ -4027,6 +4027,9 @@ class CommandLineFlags { \ product(bool, EnableJFR, false, "Enable JFR feature") \ \ + product(bool, UnlockCommercialFeatures, false, \ + "This flag is ignored. Left for compatibility") \ + \ lp64_product(bool, CompilationWarmUpRecording, false, \ "Collect profiling information for JWarmUP") \ \ diff --git a/test/jfr/test_unlockCommercialFeatures_compatibility.sh b/test/jfr/test_unlockCommercialFeatures_compatibility.sh new file mode 100644 index 0000000000000000000000000000000000000000..bb4509b91343035dc68000f4cb22f34f82755eba --- /dev/null +++ b/test/jfr/test_unlockCommercialFeatures_compatibility.sh @@ -0,0 +1,51 @@ +#!/usr/bin/env bash +# +# @test +# @summary Test 'jcmd VM.unlock_commercial_features' +# @run shell/timeout=500 test_unlockCommercialFeatures_compatibility.sh +# + +if [ "${TESTSRC}" = "" ] +then + TESTSRC=${PWD} + echo "TESTSRC not set. Using "${TESTSRC}" as default" +fi +echo "TESTSRC=${TESTSRC}" +## Adding common setup Variables for running shell tests. +. ${TESTSRC}/../test_env.sh + +JAVA=${TESTJAVA}${FS}bin${FS}java +JAVAC=${TESTJAVA}${FS}bin${FS}javac +JCMD=${TESTJAVA}${FS}bin${FS}jcmd +JPS=${TESTJAVA}${FS}bin${FS}jps + +# A simple testcase used to invoke JVM +TEST_CLASS=Test_$(date +%Y%m%d%H%M%S) +TEST_SOURCE=$TEST_CLASS.java + +cat > $TEST_SOURCE << EOF +public class ${TEST_CLASS} { + public static void main(String[] args) throws Exception{ + // keep Java process running + while (true) { Thread.sleep(1000); } + } +} +EOF + +# compile the test class +$JAVAC $TEST_SOURCE +if [ $? != '0' ]; then + echo "Failed to compile ${TEST_SOURCE}" + exit 1 +fi + +${JAVA} -XX:+EnableJFR -cp . ${TEST_CLASS}& + +PID=$(${JPS} | grep ${TEST_CLASS} | awk '{print $1}') +if [ $? != 0 ] || [ -z "${PID}" ]; then exit 1; fi + +${JCMD} ${PID} VM.unlock_commercial_features +if [ $? != 0 ]; then exit 1; fi + +kill -9 ${PID} +exit 0