8264565: Templatize num_arguments() functions of DCmd subclasses

Reviewed-by: coleenp, dholmes
This commit is contained in:
Ioi Lam 2021-04-06 03:27:09 +00:00
parent 54b4070da7
commit ff223530b6
8 changed files with 36 additions and 250 deletions

View file

@ -698,17 +698,6 @@ void StringtableDCmd::execute(DCmdSource source, TRAPS) {
VMThread::execute(&dumper);
}
int StringtableDCmd::num_arguments() {
ResourceMark rm;
StringtableDCmd* dcmd = new StringtableDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
// Sharing
#if INCLUDE_CDS_JAVA_HEAP
oop StringTable::lookup_shared(const jchar* name, int len, unsigned int hash) {

View file

@ -881,14 +881,3 @@ void SymboltableDCmd::execute(DCmdSource source, TRAPS) {
_verbose.value());
VMThread::execute(&dumper);
}
int SymboltableDCmd::num_arguments() {
ResourceMark rm;
SymboltableDCmd* dcmd = new SymboltableDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}

View file

@ -2526,14 +2526,3 @@ void SystemDictionaryDCmd::execute(DCmdSource source, TRAPS) {
_verbose.value());
VMThread::execute(&dumper);
}
int SystemDictionaryDCmd::num_arguments() {
ResourceMark rm;
SystemDictionaryDCmd* dcmd = new SystemDictionaryDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}

View file

@ -219,17 +219,6 @@ void HelpDCmd::execute(DCmdSource source, TRAPS) {
}
}
int HelpDCmd::num_arguments() {
ResourceMark rm;
HelpDCmd* dcmd = new HelpDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
void VersionDCmd::execute(DCmdSource source, TRAPS) {
output()->print_cr("%s version %s", VM_Version::vm_name(),
VM_Version::vm_release());
@ -258,17 +247,6 @@ void PrintVMFlagsDCmd::execute(DCmdSource source, TRAPS) {
}
}
int PrintVMFlagsDCmd::num_arguments() {
ResourceMark rm;
PrintVMFlagsDCmd* dcmd = new PrintVMFlagsDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
SetVMFlagDCmd::SetVMFlagDCmd(outputStream* output, bool heap) :
DCmdWithParser(output, heap),
_flag("flag name", "The name of the flag we want to set",
@ -292,17 +270,6 @@ void SetVMFlagDCmd::execute(DCmdSource source, TRAPS) {
}
}
int SetVMFlagDCmd::num_arguments() {
ResourceMark rm;
SetVMFlagDCmd* dcmd = new SetVMFlagDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
void JVMTIDataDumpDCmd::execute(DCmdSource source, TRAPS) {
if (JvmtiExport::should_post_data_dump()) {
JvmtiExport::post_data_dump();
@ -360,16 +327,6 @@ void JVMTIAgentLoadDCmd::execute(DCmdSource source, TRAPS) {
}
}
int JVMTIAgentLoadDCmd::num_arguments() {
ResourceMark rm;
JVMTIAgentLoadDCmd* dcmd = new JVMTIAgentLoadDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
#endif // INCLUDE_JVMTI
#endif // INCLUDE_SERVICES
@ -432,17 +389,6 @@ void VMUptimeDCmd::execute(DCmdSource source, TRAPS) {
output()->print_cr(" s");
}
int VMUptimeDCmd::num_arguments() {
ResourceMark rm;
VMUptimeDCmd* dcmd = new VMUptimeDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
void VMInfoDCmd::execute(DCmdSource source, TRAPS) {
VMError::print_vm_info(_output);
}
@ -544,17 +490,6 @@ void HeapDumpDCmd::execute(DCmdSource source, TRAPS) {
dumper.dump(_filename.value(), output(), (int) level);
}
int HeapDumpDCmd::num_arguments() {
ResourceMark rm;
HeapDumpDCmd* dcmd = new HeapDumpDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
ClassHistogramDCmd::ClassHistogramDCmd(outputStream* output, bool heap) :
DCmdWithParser(output, heap),
_all("-all", "Inspect all objects, including unreachable objects",
@ -568,17 +503,6 @@ void ClassHistogramDCmd::execute(DCmdSource source, TRAPS) {
VMThread::execute(&heapop);
}
int ClassHistogramDCmd::num_arguments() {
ResourceMark rm;
ClassHistogramDCmd* dcmd = new ClassHistogramDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
#endif // INCLUDE_SERVICES
ThreadDumpDCmd::ThreadDumpDCmd(outputStream* output, bool heap) :
@ -603,17 +527,6 @@ void ThreadDumpDCmd::execute(DCmdSource source, TRAPS) {
VMThread::execute(&op3);
}
int ThreadDumpDCmd::num_arguments() {
ResourceMark rm;
ThreadDumpDCmd* dcmd = new ThreadDumpDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
// Enhanced JMX Agent support
JMXStartRemoteDCmd::JMXStartRemoteDCmd(outputStream *output, bool heap_allocated) :
@ -729,19 +642,6 @@ JMXStartRemoteDCmd::JMXStartRemoteDCmd(outputStream *output, bool heap_allocated
_dcmdparser.add_dcmd_option(&_jdp_name);
}
int JMXStartRemoteDCmd::num_arguments() {
ResourceMark rm;
JMXStartRemoteDCmd* dcmd = new JMXStartRemoteDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
void JMXStartRemoteDCmd::execute(DCmdSource source, TRAPS) {
ResourceMark rm(THREAD);
HandleMark hm(THREAD);
@ -929,17 +829,6 @@ void CodeHeapAnalyticsDCmd::execute(DCmdSource source, TRAPS) {
CompileBroker::print_heapinfo(output(), _function.value(), granularity);
}
int CodeHeapAnalyticsDCmd::num_arguments() {
ResourceMark rm;
CodeHeapAnalyticsDCmd* dcmd = new CodeHeapAnalyticsDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
//---< END >--- CodeHeap State Analytics.
EventLogDCmd::EventLogDCmd(outputStream* output, bool heap) :
@ -970,17 +859,6 @@ void EventLogDCmd::execute(DCmdSource source, TRAPS) {
}
}
int EventLogDCmd::num_arguments() {
ResourceMark rm;
EventLogDCmd* dcmd = new EventLogDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
void CompilerDirectivesPrintDCmd::execute(DCmdSource source, TRAPS) {
DirectivesStack::print(output());
}
@ -995,17 +873,6 @@ void CompilerDirectivesAddDCmd::execute(DCmdSource source, TRAPS) {
DirectivesParser::parse_from_file(_filename.value(), output());
}
int CompilerDirectivesAddDCmd::num_arguments() {
ResourceMark rm;
CompilerDirectivesAddDCmd* dcmd = new CompilerDirectivesAddDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
void CompilerDirectivesRemoveDCmd::execute(DCmdSource source, TRAPS) {
DirectivesStack::pop(1);
}
@ -1032,18 +899,6 @@ void ClassHierarchyDCmd::execute(DCmdSource source, TRAPS) {
_print_subclasses.value(), _classname.value());
VMThread::execute(&printClassHierarchyOp);
}
int ClassHierarchyDCmd::num_arguments() {
ResourceMark rm;
ClassHierarchyDCmd* dcmd = new ClassHierarchyDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
#endif
class VM_DumpTouchedMethods : public VM_Operation {
@ -1061,10 +916,6 @@ public:
}
};
TouchedMethodsDCmd::TouchedMethodsDCmd(outputStream* output, bool heap) :
DCmdWithParser(output, heap)
{}
void TouchedMethodsDCmd::execute(DCmdSource source, TRAPS) {
if (!LogTouchedMethods) {
output()->print_cr("VM.print_touched_methods command requires -XX:+LogTouchedMethods");
@ -1073,19 +924,11 @@ void TouchedMethodsDCmd::execute(DCmdSource source, TRAPS) {
VM_DumpTouchedMethods dumper(output());
VMThread::execute(&dumper);
}
int TouchedMethodsDCmd::num_arguments() {
return 0;
}
#if INCLUDE_JVMTI
extern "C" typedef char const* (JNICALL *debugInit_startDebuggingViaCommandPtr)(JNIEnv* env, jthread thread, char const** transport_name,
char const** address, jboolean* first_start);
static debugInit_startDebuggingViaCommandPtr dvc_start_ptr = NULL;
DebugOnCmdStartDCmd::DebugOnCmdStartDCmd(outputStream* output, bool heap) : DCmdWithParser(output, heap) {
}
void DebugOnCmdStartDCmd::execute(DCmdSource source, TRAPS) {
char const* transport = NULL;
char const* addr = NULL;

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -52,7 +52,6 @@ public:
"'help all' will show help for all commands.";
}
static const char* impact() { return "Low"; }
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
@ -69,7 +68,6 @@ public:
"java.vm.version", "read"};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -86,7 +84,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS) {
Arguments::print_on(_output);
}
@ -108,7 +105,6 @@ public:
"*", "read"};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -130,7 +126,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
@ -153,7 +148,6 @@ public:
"control", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
@ -172,7 +166,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -194,7 +187,6 @@ public:
"control", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
#endif // INCLUDE_JVMTI
@ -217,9 +209,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments() {
return 0;
};
virtual void execute(DCmdSource source, TRAPS);
};
@ -235,7 +224,6 @@ public:
static const char* impact() {
return "Low";
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
@ -252,7 +240,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -266,7 +253,6 @@ public:
static const char* impact() {
return "Medium: Depends on Java heap size and content.";
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -280,7 +266,6 @@ public:
static const char* impact() {
return "Medium: Depends on Java content.";
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -294,7 +279,6 @@ public:
static const char* impact() {
return "Medium";
}
static int num_arguments() { return 0; }
static const JavaPermission permission() {
JavaPermission p = {"java.lang.management.ManagementPermission",
"monitor", NULL};
@ -314,7 +298,6 @@ public:
static const char* impact() {
return "Medium";
}
static int num_arguments() { return 0; }
static const JavaPermission permission() {
JavaPermission p = {"java.lang.management.ManagementPermission",
"monitor", NULL};
@ -348,7 +331,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
#endif // INCLUDE_SERVICES
@ -373,7 +355,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
@ -400,13 +381,12 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
class TouchedMethodsDCmd : public DCmdWithParser {
class TouchedMethodsDCmd : public DCmd {
public:
TouchedMethodsDCmd(outputStream* output, bool heap);
TouchedMethodsDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
static const char* name() {
return "VM.print_touched_methods";
}
@ -416,7 +396,6 @@ public:
static const char* impact() {
return "Medium: Depends on Java content.";
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
@ -439,7 +418,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
@ -488,10 +466,7 @@ public:
return "Start remote management agent.";
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
class JMXStartLocalDCmd : public DCmd {
@ -573,7 +548,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -595,7 +569,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
#endif // LINUX
@ -617,7 +590,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -638,7 +610,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -664,7 +635,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
//---< END >--- CodeHeap State Analytics.
@ -686,7 +656,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -707,7 +676,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -730,7 +698,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
@ -751,7 +718,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
@ -817,7 +783,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
@ -840,7 +805,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
@ -863,14 +827,13 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};
#if INCLUDE_JVMTI
class DebugOnCmdStartDCmd : public DCmdWithParser {
class DebugOnCmdStartDCmd : public DCmd {
public:
DebugOnCmdStartDCmd(outputStream* output, bool heap);
DebugOnCmdStartDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
static const char* name() {
return "VM.start_java_debugging";
}
@ -884,7 +847,6 @@ public:
JavaPermission p = { "java.lang.management.ManagementPermission", "control", NULL };
return p;
}
static int num_arguments() { return 0; }
virtual void execute(DCmdSource source, TRAPS);
};
#endif // INCLUDE_JVMTI
@ -909,7 +871,6 @@ public:
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
};

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -27,10 +27,12 @@
#include "classfile/vmSymbols.hpp"
#include "memory/allocation.hpp"
#include "memory/resourceArea.hpp"
#include "runtime/arguments.hpp"
#include "runtime/os.hpp"
#include "runtime/vmThread.hpp"
#include "utilities/ostream.hpp"
#include <type_traits>
enum DCmdSource {
@ -274,6 +276,10 @@ public:
JavaPermission p = {NULL, NULL, NULL};
return p;
}
// num_arguments() is used by the DCmdFactoryImpl::get_num_arguments() template functions.
// - For subclasses of DCmdWithParser, it's calculated by DCmdParser::num_arguments().
// - Other subclasses of DCmd have zero arguments by default. You can change this
// by defining your own version of MyDCmd::num_arguments().
static int num_arguments() { return 0; }
outputStream* output() const { return _output; }
bool is_heap_allocated() const { return _is_heap_allocated; }
@ -321,6 +327,9 @@ public:
virtual void print_help(const char* name) const;
virtual GrowableArray<const char*>* argument_name_array() const;
virtual GrowableArray<DCmdArgumentInfo*>* argument_info_array() const;
DCmdParser* dcmdparser() {
return &_dcmdparser;
}
};
class DCmdMark : public StackObj {
@ -404,7 +413,7 @@ private:
template <class DCmdClass> class DCmdFactoryImpl : public DCmdFactory {
public:
DCmdFactoryImpl(uint32_t flags, bool enabled, bool hidden) :
DCmdFactory(DCmdClass::num_arguments(), flags, enabled, hidden) { }
DCmdFactory(get_num_arguments<DCmdClass>(), flags, enabled, hidden) { }
// Returns a resourceArea allocated instance
DCmd* create_resource_instance(outputStream* output) const {
return new DCmdClass(output, false);
@ -424,6 +433,24 @@ public:
const char* disabled_message() const {
return DCmdClass::disabled_message();
}
private:
template <typename T, ENABLE_IF(!std::is_base_of<DCmdWithParser, T>::value)>
static int get_num_arguments() {
return T::num_arguments();
}
template <typename T, ENABLE_IF(std::is_base_of<DCmdWithParser, T>::value)>
static int get_num_arguments() {
ResourceMark rm;
DCmdClass* dcmd = new DCmdClass(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->dcmdparser()->num_arguments();
} else {
return 0;
}
}
};
// This class provides a convenient way to register Dcmds, without a need to change

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -160,17 +160,6 @@ void NMTDCmd::execute(DCmdSource source, TRAPS) {
}
}
int NMTDCmd::num_arguments() {
ResourceMark rm;
NMTDCmd* dcmd = new NMTDCmd(NULL, false);
if (dcmd != NULL) {
DCmdMark mark(dcmd);
return dcmd->_dcmdparser.num_arguments();
} else {
return 0;
}
}
void NMTDCmd::report(bool summaryOnly, size_t scale_unit) {
MemBaseline baseline;
if (baseline.baseline(summaryOnly)) {

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2012, 2021, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -60,7 +60,6 @@ class NMTDCmd: public DCmdWithParser {
"monitor", NULL};
return p;
}
static int num_arguments();
virtual void execute(DCmdSource source, TRAPS);
private: