Skip to content

Commit

Permalink
Merge pull request #21070 from JasonFengJ9/jfrjcmd
Browse files Browse the repository at this point in the history
JFR can invoke VM.setJFRRecordingFileName() before VM.startJFR()
  • Loading branch information
tajila authored Feb 6, 2025
2 parents f6f1da0 + c28c696 commit 516d0f5
Show file tree
Hide file tree
Showing 2 changed files with 19 additions and 18 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -448,35 +448,33 @@ private static String parseStringParameter(String paramName, String[] parameters

private static DiagnosticProperties doJFR(String diagnosticCommand) {
DiagnosticProperties result = null;

// split the command and arguments
String[] parts = diagnosticCommand.split(DIAGNOSTICS_OPTION_SEPARATOR);
IPC.logMessage("doJFR: ", diagnosticCommand);

// ensure there's at least one part for the command
if (parts.length == 0) {
return DiagnosticProperties.makeErrorProperties("Error: No JFR command specified");
}

String command = parts[0].trim();
String[] parameters = Arrays.copyOfRange(parts, 1, parts.length);

String fileName = parseStringParameter("filename", parameters, null);
IPC.logMessage("doJFR: filename = ", fileName);
boolean setFileName = (fileName != null) && !fileName.isEmpty();
if (setFileName) {
if (!VM.setJFRRecordingFileName(fileName)) {
return DiagnosticProperties.makeErrorProperties("setJFRRecordingFileName failed");
} else {
jfrRecordingFileName = fileName;
}
}

try {
if (command.equalsIgnoreCase(DIAGNOSTICS_JFR_START)) {
if (VM.isJFRRecordingStarted()) {
result = DiagnosticProperties.makeErrorProperties("One JFR recording is in progress [" + jfrRecordingFileName + "], only one recording is allowed at a time.");
} else {
// only JFR.start command is allowed to change the recording filename
boolean setFileName = (fileName != null) && !fileName.isEmpty();
if (setFileName) {
// the recording filename should be set before VM.startJFR() which invokes JFRWriter:openJFRFile()
if (!VM.setJFRRecordingFileName(fileName)) {
return DiagnosticProperties.makeErrorProperties("setJFRRecordingFileName() failed");
} else {
jfrRecordingFileName = fileName;
}
}
VM.startJFR();
long duration = parseTimeParameter("duration", parameters);
IPC.logMessage("doJFR: duration = " + duration);
Expand Down
15 changes: 9 additions & 6 deletions runtime/vm/jfr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1127,12 +1127,15 @@ jfrSamplingThreadProc(void *entryArg)
jboolean
setJFRRecordingFileName(J9JavaVM *vm, char *fileName)
{
UDATA defaultFileNameLen = strlen(DEFAULT_JFR_FILE_NAME);
if ((defaultFileNameLen != strlen(vm->jfrState.jfrFileName))
|| (0 != strncmp(DEFAULT_JFR_FILE_NAME, vm->jfrState.jfrFileName, defaultFileNameLen))
) {
PORT_ACCESS_FROM_JAVAVM(vm);
j9mem_free_memory(vm->jfrState.jfrFileName);
if (NULL != vm->jfrState.jfrFileName) {
UDATA defaultFileNameLen = strlen(DEFAULT_JFR_FILE_NAME);
const char *jfrFileName = vm->jfrState.jfrFileName;
if ((defaultFileNameLen != strlen(jfrFileName))
|| (0 != strncmp(DEFAULT_JFR_FILE_NAME, jfrFileName, defaultFileNameLen))
) {
PORT_ACCESS_FROM_JAVAVM(vm);
j9mem_free_memory(vm->jfrState.jfrFileName);
}
}
vm->jfrState.jfrFileName = fileName;
VM_JFRWriter::closeJFRFile(vm);
Expand Down

0 comments on commit 516d0f5

Please sign in to comment.