--- old/test/jdk/ProblemList.txt 2018-06-05 05:38:08.299385419 -0400 +++ new/test/jdk/ProblemList.txt 2018-06-05 05:38:06.755296070 -0400 @@ -545,7 +545,6 @@ com/sun/management/OperatingSystemMXBean/GetProcessCpuLoad.java 8030957 aix-all com/sun/management/OperatingSystemMXBean/GetSystemCpuLoad.java 8030957 aix-all -sun/management/HotspotRuntimeMBean/GetSafepointSyncTime.java 8174734 generic-all ############################################################################ --- old/test/jdk/sun/management/HotspotRuntimeMBean/GetSafepointSyncTime.java 2018-06-05 05:38:12.603634485 -0400 +++ new/test/jdk/sun/management/HotspotRuntimeMBean/GetSafepointSyncTime.java 2018-06-05 05:38:11.055544904 -0400 @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2018, 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 @@ -23,7 +23,7 @@ /* * @test - * @bug 4858522 + * @bug 4858522 8174734 * @summary Basic unit test of HotspotRuntimeMBean.getSafepointSyncTime() * @author Steve Bohne * @@ -43,50 +43,71 @@ private static final long NUM_THREAD_DUMPS = 300; - // Careful with these values. - private static final long MIN_VALUE_FOR_PASS = 1; - private static final long MAX_VALUE_FOR_PASS = Long.MAX_VALUE; + static void checkPositive(long value, String label) { + if (value < 0) + throw new RuntimeException(label + " had a negative value of " + + value); + } + + static void validate(long count1, long count2, long time1, long time2, + String label) { + checkPositive(count1, label + ":count1"); + checkPositive(count2, label + ":count2"); + checkPositive(time1, label + ":time1"); + checkPositive(time2, label + ":time2"); + + long countDiff = count2 - count1; + long timeDiff = time2 - time1; + + if (countDiff < NUM_THREAD_DUMPS) { + throw new RuntimeException(label + + ": Expected at least " + NUM_THREAD_DUMPS + + "safepoints but only got " + countDiff); + } + + // getSafepointSyncTime is the accumulated time spent getting to a + // safepoint, so each safepoint will add a little to this, but the + // resolution is only milliseconds so we may not see it. + if (timeDiff < 0) { + throw new RuntimeException(label + ": Safepoint sync time " + + "decreased unexpectedly " + + "(time1 = " + time1 + "; " + + "time2 = " + time2 + ")"); + } + + System.out.format("%s: Safepoint count=%d (diff=%d), sync time=%d ms (diff=%d)%n", + label, count2, countDiff, time2, timeDiff); + + } public static void main(String args[]) throws Exception { long count = mbean.getSafepointCount(); - long value = mbean.getSafepointSyncTime(); + long time = mbean.getSafepointSyncTime(); + + checkPositive(count, "count"); + checkPositive(time, "time"); + + // Thread.getAllStackTraces() should cause a safepoint. - // Thread.getAllStackTraces() should cause safepoints. - // If this test is failing because it doesn't, - // MIN_VALUE_FOR_PASS should be reset to 0 for (int i = 0; i < NUM_THREAD_DUMPS; i++) { Thread.getAllStackTraces(); } long count1 = mbean.getSafepointCount(); - long value1 = mbean.getSafepointSyncTime(); + long time1 = mbean.getSafepointSyncTime(); - System.out.format("Safepoint count=%d (diff=%d), sync time=%d ms (diff=%d)%n", - count1, count1-count, value1, value1-value); + validate(count, count1, time, time1, "Pass 1"); - if (value1 < MIN_VALUE_FOR_PASS || value1 > MAX_VALUE_FOR_PASS) { - throw new RuntimeException("Safepoint sync time " + - "illegal value: " + value1 + " ms " + - "(MIN = " + MIN_VALUE_FOR_PASS + "; " + - "MAX = " + MAX_VALUE_FOR_PASS + ")"); - } + // repeat the experiment for (int i = 0; i < NUM_THREAD_DUMPS; i++) { Thread.getAllStackTraces(); } long count2 = mbean.getSafepointCount(); - long value2 = mbean.getSafepointSyncTime(); - - System.out.format("Safepoint count=%d (diff=%d), sync time=%d ms (diff=%d)%n", - count2, count2-count1, value2, value2-value1); + long time2 = mbean.getSafepointSyncTime(); - if (value2 <= value1) { - throw new RuntimeException("Safepoint sync time " + - "did not increase " + - "(value1 = " + value1 + "; " + - "value2 = " + value2 + ")"); - } + validate(count1, count2, time1, time2, "Pass 2"); System.out.println("Test passed."); }