Skip to content

Commit 1989bb1

Browse files
committed
GH-297 added support for JDK 9 and JDK 10
1 parent baa8de3 commit 1989bb1

File tree

2 files changed

+55
-15
lines changed

2 files changed

+55
-15
lines changed

visualvm/attach/src/org/graalvm/visualvm/attach/AttachModelImpl.java

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,12 @@ class AttachModelImpl extends AttachModel {
5656
static final String JCMD_JFR_DUMP = "JFR.dump"; // NOI18N
5757
static final String JCMD_JFR_DUMP_FILENAME = "filename"; // NOI18N
5858
static final String JCMD_JFR_DUMP_RECORDING = "recording"; // NOI18N
59+
static final String JCMD_JFR_DUMP_NAME = "name"; // NOI18N
5960
static final String JCMD_JFR_CHECK = "JFR.check"; // NOI18N
6061
static final String JCMD_JFR_CHECK_RECORDING_ID = "recording="; // NOI18N
6162
static final String JCMD_JFR_CHECK_RECORDING_ID1 = "Recording "; // NOI18N
63+
static final String JCMD_JFR_CHECK_HELP_OPTIONS_ID = "Options: "; // NOI18N
64+
static final String JCMD_JFR_CHECK_HELP_RECORDING_ID = "recording : "; // NOI18N
6265
static final String JCMD_JFR_START = "JFR.start"; // NOI18N
6366
private static final String JCMD_JFR_START_NAME = "name"; // NOI18N
6467
private static final String JCMD_JFR_START_SETTINGS = "settings"; // NOI18N
@@ -73,13 +76,14 @@ class AttachModelImpl extends AttachModel {
7376
static final String JCMD_JFR_STOP_NAME = "name"; // NOI18N
7477
static final String JCMD_JFR_UNLOCK_ID = "Use VM.unlock_commercial_features to enable"; // NOI18N
7578
static final String JCMD_UNLOCK_CF = "VM.unlock_commercial_features"; // NOI18N
79+
static final String JCMD_HELP = "help"; // NOI18N
7680
static final String JCMD_CF_ID = " unlocked."; // NOI18N
7781
static final Logger LOGGER = Logger.getLogger(AttachModelImpl.class.getName());
7882

7983
String pid;
8084
HotSpotVirtualMachine vm;
8185
Map<String,String> commandLineMap;
82-
Boolean oldJFR;
86+
boolean oldJFR;
8387
Boolean jfrAvailable;
8488

8589
AttachModelImpl(Application app) {
@@ -194,6 +198,9 @@ public synchronized boolean isJfrAvailable() {
194198
jfrAvailable = Boolean.TRUE;
195199
}
196200
}
201+
if (Boolean.TRUE.equals(jfrAvailable)) {
202+
oldJFR = checkForOldJFR();
203+
}
197204
}
198205
return jfrAvailable;
199206
}
@@ -218,7 +225,6 @@ public List<Long> jfrCheck() {
218225
if (recEnd > recStart) {
219226
String recordingNum = line.substring(recStart, recEnd);
220227
recNumbers.add(Long.valueOf(recordingNum));
221-
oldJFR = Boolean.TRUE;
222228
}
223229
} else if (line.startsWith(JCMD_JFR_CHECK_RECORDING_ID1)) {
224230
int recStart = JCMD_JFR_CHECK_RECORDING_ID1.length();
@@ -227,7 +233,6 @@ public List<Long> jfrCheck() {
227233
if (recEnd > recStart) {
228234
String recordingNum = line.substring(recStart, recEnd);
229235
recNumbers.add(Long.valueOf(recordingNum));
230-
oldJFR = Boolean.FALSE;
231236
}
232237
}
233238
}
@@ -240,9 +245,7 @@ public String takeJfrDump(long recording, String fileName) {
240245
}
241246
Map<String, Object> pars = new HashMap();
242247
pars.put(JCMD_JFR_DUMP_FILENAME, fileName);
243-
if (Boolean.TRUE.equals(oldJFR)) {
244-
pars.put(JCMD_JFR_DUMP_RECORDING, recording);
245-
}
248+
pars.put(oldJFR ? JCMD_JFR_DUMP_RECORDING : JCMD_JFR_DUMP_NAME, recording);
246249
return executeJCmd(JCMD_JFR_DUMP, pars);
247250
}
248251

@@ -261,7 +264,7 @@ public boolean startJfrRecording(String name, String[] settings, Long delay,
261264
if (maxSize != null) pars.put(JCMD_JFR_START_MAXSIZE, maxSize);
262265
if (dumpOnExit != null) pars.put(JCMD_JFR_START_DUMPONEXIT, dumpOnExit);
263266
if (path != null) pars.put(JCMD_JFR_START_FILENAME, path);
264-
if (disk != null && Boolean.FALSE.equals(oldJFR)) pars.put(JCMD_JFR_START_DISK, disk);
267+
if (disk != null && !oldJFR) pars.put(JCMD_JFR_START_DISK, disk);
265268
executeJCmd(JCMD_JFR_START, pars);
266269
return true;
267270
}
@@ -270,7 +273,7 @@ public boolean stopJfrRecording() {
270273
if (!isJfrAvailable()) {
271274
throw new UnsupportedOperationException();
272275
}
273-
String recKey = Boolean.TRUE.equals(oldJFR) ? JCMD_JFR_DUMP_RECORDING : JCMD_JFR_STOP_NAME;
276+
String recKey = oldJFR ? JCMD_JFR_DUMP_RECORDING : JCMD_JFR_STOP_NAME;
274277
for (Long recording : jfrCheck()) {
275278
Map<String,Object> pars = Collections.singletonMap(recKey, recording);
276279
executeJCmd(JCMD_JFR_STOP, pars);
@@ -314,11 +317,27 @@ private static String quoteString(String val) {
314317
return val;
315318
}
316319

320+
private boolean checkForOldJFR() {
321+
String ret = getJCmdHelp(JCMD_JFR_CHECK);
322+
323+
if (ret != null) {
324+
int options = ret.indexOf(JCMD_JFR_CHECK_HELP_OPTIONS_ID);
325+
int recording = ret.indexOf(JCMD_JFR_CHECK_HELP_RECORDING_ID);
326+
327+
return options != -1 && options < recording;
328+
}
329+
return false;
330+
}
331+
317332
private boolean unlockCommercialFeature() {
318333
String ret = executeJCmd(JCMD_UNLOCK_CF);
319334
return ret.contains(JCMD_CF_ID);
320335
}
321336

337+
private String getJCmdHelp(String command) {
338+
return executeJCmd(JCMD_HELP+" "+command);
339+
}
340+
322341
private synchronized Map<String,String> getVMCommandLine() {
323342
if (commandLineMap == null) {
324343
String text = executeJCmd(JCMD_VM_COMMAND_LINE);

visualvm/jmx/src/org/graalvm/visualvm/jmx/impl/JmxSupport.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,9 +81,12 @@ public class JmxSupport {
8181
private static final String JCMD_JFR_DUMP = "jfrDump"; // NOI18N
8282
private static final String JCMD_JFR_DUMP_FILENAME = "filename"; // NOI18N
8383
private static final String JCMD_JFR_DUMP_RECORDING = "recording"; // NOI18N
84+
private static final String JCMD_JFR_DUMP_NAME = "name"; // NOI18N
8485
private static final String JCMD_JFR_CHECK = "jfrCheck"; // NOI18N
8586
private static final String JCMD_JFR_CHECK_RECORDING_ID = "recording="; // NOI18N
8687
private static final String JCMD_JFR_CHECK_RECORDING_ID1 = "Recording "; // NOI18N
88+
private static final String JCMD_JFR_CHECK_HELP_OPTIONS_ID = "Options: "; // NOI18N
89+
private static final String JCMD_JFR_CHECK_HELP_RECORDING_ID = "recording : "; // NOI18N
8790
private static final String JCMD_JFR_START = "jfrStart"; // NOI18N
8891
private static final String JCMD_JFR_START_NAME = "name"; // NOI18N
8992
private static final String JCMD_JFR_START_SETTINGS = "settings"; // NOI18N
@@ -98,6 +101,7 @@ public class JmxSupport {
98101
private static final String JCMD_JFR_STOP_NAME = "name"; // NOI18N
99102
private static final String JCMD_JFR_UNLOCK_ID = "Use VM.unlock_commercial_features to enable"; // NOI18N
100103
private static final String JCMD_UNLOCK_CF = "vmUnlockCommercialFeatures"; // NOI18N
104+
private static final String JCMD_HELP = "help"; // NOI18N
101105
private static final String JCMD_CF_ID = " unlocked."; // NOI18N
102106
private static final Map EMPTY_PARS = Collections.singletonMap("", null);
103107

@@ -456,6 +460,9 @@ synchronized boolean isJfrAvailable() {
456460
jfrAvailable = Boolean.TRUE;
457461
}
458462
}
463+
if (Boolean.TRUE.equals(jfrAvailable)) {
464+
oldJFR = checkForOldJFR();
465+
}
459466
}
460467
return jfrAvailable;
461468
}
@@ -480,7 +487,6 @@ List<Long> jfrCheck() {
480487
if (recEnd > recStart) {
481488
String recordingNum = line.substring(recStart, recEnd);
482489
recNumbers.add(Long.valueOf(recordingNum));
483-
oldJFR = Boolean.TRUE;
484490
}
485491
} else if (line.startsWith(JCMD_JFR_CHECK_RECORDING_ID1)) {
486492
int recStart = JCMD_JFR_CHECK_RECORDING_ID1.length();
@@ -489,7 +495,6 @@ List<Long> jfrCheck() {
489495
if (recEnd > recStart) {
490496
String recordingNum = line.substring(recStart, recEnd);
491497
recNumbers.add(Long.valueOf(recordingNum));
492-
oldJFR = Boolean.FALSE;
493498
}
494499
}
495500
}
@@ -502,9 +507,7 @@ String takeJfrDump(long recording, String fileName) {
502507
}
503508
Map<String, Object> pars = new HashMap();
504509
pars.put(JCMD_JFR_DUMP_FILENAME, fileName);
505-
if (Boolean.TRUE.equals(oldJFR)) {
506-
pars.put(JCMD_JFR_DUMP_RECORDING, recording);
507-
}
510+
pars.put(oldJFR ? JCMD_JFR_DUMP_RECORDING : JCMD_JFR_DUMP_NAME, recording);
508511
return executeJCmd(JCMD_JFR_DUMP, pars);
509512
}
510513

@@ -523,8 +526,9 @@ boolean startJfrRecording(String name, String[] settings, Long delay,
523526
if (maxSize != null) pars.put(JCMD_JFR_START_MAXSIZE, maxSize);
524527
if (dumpOnExit != null) pars.put(JCMD_JFR_START_DUMPONEXIT, dumpOnExit);
525528
if (path != null) pars.put(JCMD_JFR_START_FILENAME, path);
526-
if (disk != null && Boolean.FALSE.equals(oldJFR)) pars.put(JCMD_JFR_START_DISK, disk);
529+
if (disk != null && !oldJFR) pars.put(JCMD_JFR_START_DISK, disk);
527530

531+
if (pars.isEmpty()) pars = EMPTY_PARS;
528532
executeJCmd(JCMD_JFR_START, pars);
529533
return true;
530534
}
@@ -533,7 +537,7 @@ boolean stopJfrRecording() {
533537
if (!isJfrAvailable()) {
534538
throw new UnsupportedOperationException();
535539
}
536-
String recKey = Boolean.TRUE.equals(oldJFR) ? JCMD_JFR_DUMP_RECORDING : JCMD_JFR_STOP_NAME;
540+
String recKey = oldJFR ? JCMD_JFR_DUMP_RECORDING : JCMD_JFR_STOP_NAME;
537541
for (Long recording : jfrCheck()) {
538542
Map<String,Object> pars = Collections.singletonMap(recKey, recording);
539543
executeJCmd(JCMD_JFR_STOP, pars);
@@ -558,11 +562,28 @@ private String getJfrCheck() {
558562
return executeJCmd(JCMD_JFR_CHECK, EMPTY_PARS);
559563
}
560564

565+
private boolean checkForOldJFR() {
566+
String ret = getJCmdHelp(JCMD_JFR_CHECK);
567+
568+
if (ret != null) {
569+
int options = ret.indexOf(JCMD_JFR_CHECK_HELP_OPTIONS_ID);
570+
int recording = ret.indexOf(JCMD_JFR_CHECK_HELP_RECORDING_ID);
571+
572+
return options != -1 && options < recording;
573+
}
574+
return false;
575+
}
576+
561577
private boolean unlockCommercialFeature() {
562578
String ret = executeJCmd(JCMD_UNLOCK_CF);
563579
return ret.contains(JCMD_CF_ID);
564580
}
565581

582+
private String getJCmdHelp(String command) {
583+
Map pars = Collections.singletonMap(command, null);
584+
return executeJCmd(JCMD_HELP, pars);
585+
}
586+
566587
private String executeJCmd(String command) {
567588
return executeJCmd(command, Collections.EMPTY_MAP);
568589
}

0 commit comments

Comments
 (0)