handle timestamp in parse_and_execute(). Thread.print is exceptional. Add default initialation to JcmdOptions

This commit is contained in:
Ivan Bereziuk 2026-01-21 16:58:16 +01:00
parent 5f1cefe074
commit 4fca769a67
3 changed files with 19 additions and 100 deletions

View File

@ -182,12 +182,6 @@ static int compare_strings(const char** s1, const char** s2) {
return ::strcmp(*s1, *s2);
}
static void print_local_time(outputStream* output) {
char buf[32];
output->print_cr("%s", os::local_time_string(buf, sizeof(buf)));
}
void HelpDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (_all.value()) {
GrowableArray<const char*>* cmd_list = DCmdFactory::DCmd_list(source);
@ -232,10 +226,6 @@ void HelpDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAP
}
void VersionDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
output()->print_cr("%s version %s", VM_Version::vm_name(),
VM_Version::vm_release());
JDK_Version jdk_version = JDK_Version::current();
@ -256,10 +246,6 @@ PrintVMFlagsDCmd::PrintVMFlagsDCmd(outputStream* output, bool heap) :
}
void PrintVMFlagsDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
if (_all.value()) {
JVMFlag::printFlags(output(), true);
} else {
@ -408,10 +394,6 @@ void VMUptimeDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions,
}
void VMInfoDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
VMError::print_vm_info(_output);
}
@ -428,19 +410,11 @@ void RunFinalizationDCmd::execute(DCmdSource source, const JcmdOptions& commonOp
}
void HeapInfoDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
MutexLocker hl(THREAD, Heap_lock);
Universe::heap()->print_heap_on(output());
}
void FinalizerInfoDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
ResourceMark rm(THREAD);
if (!InstanceKlass::is_finalization_enabled()) {
@ -514,10 +488,6 @@ HeapDumpDCmd::HeapDumpDCmd(outputStream* output, bool heap) :
}
void HeapDumpDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
jlong level = -1; // -1 means no compression.
jlong parallel = HeapDumper::default_num_of_dump_threads();
@ -565,10 +535,6 @@ ClassHistogramDCmd::ClassHistogramDCmd(outputStream* output, bool heap) :
}
void ClassHistogramDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
jlong num = _parallel_thread_num.value();
if (num < 0) {
output()->print_cr("Parallel thread number out of range (>=0): " JLONG_FORMAT, num);
@ -593,9 +559,18 @@ ThreadDumpDCmd::ThreadDumpDCmd(outputStream* output, bool heap) :
_dcmdparser.add_dcmd_option(&_extended);
}
static void print_local_time(outputStream* output) {
char buf[32];
output->print_cr("%s", os::local_time_string(buf, sizeof(buf)));
}
void ThreadDumpDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
// always timestamp
print_local_time(output());
// Timestamping is handled by the calle.
// Stay backwards compatible in cases where timestamp is not requested explicitly.
if (JcmdOptions::TimeStamp::Default == commonOptions.timestamp) {
print_local_time(output());
}
// thread stacks and JNI global handles
VM_PrintThreads op1(output(), _locks.value(), _extended.value(), true /* print JNI handle info */);
@ -834,10 +809,6 @@ JMXStatusDCmd::JMXStatusDCmd(outputStream *output, bool heap_allocated) :
}
void JMXStatusDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
ResourceMark rm(THREAD);
HandleMark hm(THREAD);
@ -871,36 +842,20 @@ VMDynamicLibrariesDCmd::VMDynamicLibrariesDCmd(outputStream *output, bool heap_a
}
void VMDynamicLibrariesDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
os::print_dll_info(output());
output()->cr();
}
void CompileQueueDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
VM_PrintCompileQueue printCompileQueueOp(output());
VMThread::execute(&printCompileQueueOp);
}
void CodeListDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
CodeCache::print_codelist(output());
}
void CodeCacheDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
CodeCache::print_layout(output());
}
@ -927,10 +882,6 @@ CodeHeapAnalyticsDCmd::CodeHeapAnalyticsDCmd(outputStream* output, bool heap) :
}
void CodeHeapAnalyticsDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
jlong granularity = _granularity.value();
if (granularity < 1) {
Exceptions::fthrow(THREAD_AND_LOCATION, vmSymbols::java_lang_IllegalArgumentException(),
@ -952,9 +903,6 @@ EventLogDCmd::EventLogDCmd(outputStream* output, bool heap) :
}
void EventLogDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
int max = (int)_max.value();
if (max < 0) {
output()->print_cr("Invalid max option: \"%d\".", max);
@ -969,9 +917,6 @@ void EventLogDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions,
}
void CompilerDirectivesPrintDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
DirectivesStack::print(output());
}
@ -1009,9 +954,6 @@ ClassHierarchyDCmd::ClassHierarchyDCmd(outputStream* output, bool heap) :
}
void ClassHierarchyDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
VM_PrintClassHierarchy printClassHierarchyOp(output(), _print_interfaces.value(),
_print_subclasses.value(), _classname.value());
VMThread::execute(&printClassHierarchyOp);
@ -1049,10 +991,6 @@ public:
};
void ClassesDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
VM_PrintClasses vmop(output(), _verbose.value());
VMThread::execute(&vmop);
}
@ -1093,10 +1031,6 @@ DumpSharedArchiveDCmd::DumpSharedArchiveDCmd(outputStream* output, bool heap) :
}
void DumpSharedArchiveDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
jboolean is_static;
const char* scmd = _suboption.value();
@ -1237,18 +1171,10 @@ static void execute_vthread_command(Symbol* method_name, outputStream* output, T
}
void VThreadSchedulerDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
execute_vthread_command(vmSymbols::printScheduler_name(), output(), CHECK);
}
void VThreadPollersDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
execute_vthread_command(vmSymbols::printPollers_name(), output(), CHECK);
}
@ -1263,10 +1189,6 @@ CompilationMemoryStatisticDCmd::CompilationMemoryStatisticDCmd(outputStream* out
}
void CompilationMemoryStatisticDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
const size_t minsize = _minsize.has_value() ? _minsize.value()._size : 0;
CompilationMemoryStatistic::print_jcmd_report(output(), _verbose.value(), _legend.value(), minsize);
}
@ -1276,10 +1198,6 @@ void CompilationMemoryStatisticDCmd::execute(DCmdSource source, const JcmdOption
SystemMapDCmd::SystemMapDCmd(outputStream* output, bool heap) : DCmd(output, heap) {}
void SystemMapDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
MemMapPrinter::print_all_mappings(output());
}
@ -1292,10 +1210,6 @@ SystemDumpMapDCmd::SystemDumpMapDCmd(outputStream* output, bool heap) :
}
void SystemDumpMapDCmd::execute(DCmdSource source, const JcmdOptions& commonOptions, TRAPS) {
if (commonOptions.timestamp == JcmdOptions::TimeStamp::Yes) {
print_local_time(output());
}
const char* name = _filename.value();
if (name == nullptr || name[0] == 0) {
output()->print_cr("filename is empty or not specified. No file written");

View File

@ -386,7 +386,7 @@ bool DCmdFactory::_has_pending_jmx_notification = false;
* @param updated_line - return value with "<cmd>"
*/
static JcmdOptions parse_common_options(const CmdLine& line, stringStream *updated_line) {
JcmdOptions options = {};
JcmdOptions options;
// there is only TIMESTAMP option so far
const char TIMESTAMP[] = "-T";
@ -463,6 +463,11 @@ void DCmd::Executor::parse_and_execute(const char* cmdline, char delim, TRAPS) {
assert(command != nullptr, "command error must be handled before this line");
DCmdMark mark(command);
command->parse(&line, delim, CHECK);
if (options.timestamp == JcmdOptions::TimeStamp::Yes){
_out->date_stamp(true, "", "\n");
}
execute(command, options, CHECK);
}
count++;

View File

@ -168,10 +168,10 @@ public:
struct JcmdOptions {
enum class TimeStamp {
Default,
Yes
Yes // timestamp was explicitly requeted with -T flag
};
TimeStamp timestamp;
TimeStamp timestamp = TimeStamp::Default;
};
// The DCmdParser class can be used to create an argument parser for a