--- old/test/TEST.groups 2015-01-02 08:39:48.843782800 -0500 +++ new/test/TEST.groups 2015-01-02 08:39:48.559761400 -0500 @@ -69,7 +69,6 @@ gc/metaspace/TestPerfCountersAndMemoryPools.java \ runtime/6819213/TestBootNativeLibraryPath.java \ runtime/7158988/FieldMonitor.java \ - runtime/7194254/Test7194254.java \ runtime/Metaspace/FragmentMetaspace.java \ runtime/NMT/BaselineWithParameter.java \ runtime/NMT/JcmdBaselineDetail.java \ @@ -94,6 +93,7 @@ runtime/NMT/VirtualAllocTestType.java \ runtime/RedefineObject/TestRedefineObject.java \ runtime/Thread/TestThreadDumpMonitorContention.java \ + runtime/Thread/ThreadPriorities.java \ runtime/XCheckJniJsig/XCheckJSig.java \ serviceability/attach/AttachWithStalePidFile.java \ serviceability/sa/jmap-hprof/JMapHProfLargeHeapTest.java \ --- /dev/null 2015-01-02 08:39:51.000000000 -0500 +++ new/test/runtime/Thread/ThreadPriorities.java 2015-01-02 08:39:50.907905000 -0500 @@ -0,0 +1,96 @@ +/* + * Copyright (c) 2012, 2015 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 + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 7194254 + * @summary Creates several threads with different java priorities and checks + * whether jstack reports correct priorities for them. + * + * @library /testlibrary + * @run main ThreadPriorities + */ + +import java.util.ArrayList; +import java.util.concurrent.CyclicBarrier; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import com.oracle.java.testlibrary.*; +import static com.oracle.java.testlibrary.Asserts.*; + +public class ThreadPriorities { + + public static void main(String[] args) throws Throwable { + final int NUMBER_OF_JAVA_PRIORITIES = + Thread.MAX_PRIORITY - Thread.MIN_PRIORITY + 1; + final CyclicBarrier barrier = + new CyclicBarrier(NUMBER_OF_JAVA_PRIORITIES + 1); + + for (int p = Thread.MIN_PRIORITY; p <= Thread.MAX_PRIORITY; ++p) { + final int priority = p; + new Thread("Priority=" + p) { + { + setPriority(priority); + } + public void run() { + try { + barrier.await(); // 1st + barrier.await(); // 2nd + } catch (Exception exc) { + // ignore + } + } + }.start(); + } + barrier.await(); // 1st + + int matches = 0; + ArrayList failed = new ArrayList<>(); + ProcessBuilder pb = new ProcessBuilder( + JDKToolFinder.getJDKTool("jstack"), + String.valueOf(ProcessTools.getProcessId())); + + String[] output = new OutputAnalyzer(pb.start()).getOutput().split("\\n+"); + + Pattern pattern = Pattern.compile( + "\\\"Priority=(\\d+)\\\".* prio=(\\d+).*"); + for (String line : output) { + Matcher matcher = pattern.matcher(line); + if (matcher.matches()) { + matches += 1; + String expected = matcher.group(1); + String actual = matcher.group(2); + if (!expected.equals(actual)) { + failed.add(line); + } + } + } + barrier.await(); // 2nd + barrier.reset(); + + assertEquals(matches, NUMBER_OF_JAVA_PRIORITIES); + assertTrue(failed.isEmpty(), failed.size() + ":" + failed); + } +} + --- old/test/runtime/7194254/Test7194254.java 2015-01-02 08:39:53.104036400 -0500 +++ /dev/null 2015-01-02 08:39:53.000000000 -0500 @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2012, 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 - * under the terms of the GNU General Public License version 2 only, as - * published by the Free Software Foundation. - * - * This code is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License - * version 2 for more details (a copy is included in the LICENSE file that - * accompanied this code). - * - * You should have received a copy of the GNU General Public License version - * 2 along with this work; if not, write to the Free Software Foundation, - * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. - * - * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA - * or visit www.oracle.com if you need additional information or have any - * questions. - */ - -/* - * @test - * @bug 7194254 - * @summary Creates several threads with different java priorities and checks - * whether jstack reports correct priorities for them. - * - * @ignore 8060219 - * @run main Test7194254 - */ - -import java.io.BufferedReader; -import java.io.InputStreamReader; -import java.lang.management.ManagementFactory; -import java.lang.management.RuntimeMXBean; -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CyclicBarrier; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class Test7194254 { - - public static void main(String[] args) throws Exception { - final int NUMBER_OF_JAVA_PRIORITIES = - Thread.MAX_PRIORITY - Thread.MIN_PRIORITY + 1; - final CyclicBarrier barrier = - new CyclicBarrier(NUMBER_OF_JAVA_PRIORITIES + 1); - - for (int p = Thread.MIN_PRIORITY; p <= Thread.MAX_PRIORITY; ++p) { - final int priority = p; - new Thread("Priority=" + p) { - { - setPriority(priority); - } - public void run() { - try { - barrier.await(); // 1st - barrier.await(); // 2nd - } catch (Exception exc) { - // ignore - } - } - }.start(); - } - barrier.await(); // 1st - - int matches = 0; - List failed = new ArrayList<>(); - try { - String pid = getPid(); - String jstack = System.getProperty("java.home") + "/../bin/jstack"; - Process process = new ProcessBuilder(jstack, pid) - .redirectErrorStream(true).start(); - Pattern pattern = Pattern.compile( - "\\\"Priority=(\\d+)\\\".* prio=(\\d+).*"); - try (BufferedReader reader = new BufferedReader( - new InputStreamReader(process.getInputStream()))) { - String line; - while((line = reader.readLine()) != null) { - Matcher matcher = pattern.matcher(line); - if (matcher.matches()) { - matches += 1; - String expected = matcher.group(1); - String actual = matcher.group(2); - if (!expected.equals(actual)) { - failed.add(line); - } - } - } - } - barrier.await(); // 2nd - } finally { - barrier.reset(); - } - - if (matches != NUMBER_OF_JAVA_PRIORITIES) { - throw new AssertionError("matches: expected " + - NUMBER_OF_JAVA_PRIORITIES + ", but was " + matches); - } - if (!failed.isEmpty()) { - throw new AssertionError(failed.size() + ":" + failed); - } - System.out.println("Test passes."); - } - - static String getPid() { - RuntimeMXBean runtimebean = ManagementFactory.getRuntimeMXBean(); - String vmname = runtimebean.getName(); - int i = vmname.indexOf('@'); - if (i != -1) { - vmname = vmname.substring(0, i); - } - return vmname; - } - -} -