test/jdk/java/util/concurrent/Phaser/TieredArriveLoops.java
author dl
Sat, 14 Sep 2019 11:26:26 -0700
changeset 58138 1e4270f875ee
parent 47216 71c04702a3d5
permissions -rw-r--r--
8225490: Miscellaneous changes imported from jsr166 CVS 2019-09 Reviewed-by: martin, alanb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
7976
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
     1
/*
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
     2
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
     3
 *
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
     4
 * This code is free software; you can redistribute it and/or modify it
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
     5
 * under the terms of the GNU General Public License version 2 only, as
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
     6
 * published by the Free Software Foundation.
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
     7
 *
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
     8
 * This code is distributed in the hope that it will be useful, but WITHOUT
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
     9
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    10
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    11
 * version 2 for more details (a copy is included in the LICENSE file that
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    12
 * accompanied this code).
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    13
 *
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    14
 * You should have received a copy of the GNU General Public License version
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    15
 * 2 along with this work; if not, write to the Free Software Foundation,
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    16
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    17
 *
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    18
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    19
 * or visit www.oracle.com if you need additional information or have any
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    20
 * questions.
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    21
 */
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    22
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    23
/*
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    24
 * This file is available under and governed by the GNU General Public
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    25
 * License version 2 only, as published by the Free Software Foundation.
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    26
 * However, the following notice accompanied the original version of this
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    27
 * file:
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    28
 *
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    29
 * Written by Doug Lea with assistance from members of JCP JSR-166
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    30
 * Expert Group and released to the public domain, as explained at
9242
ef138d47df58 7034657: Update Creative Commons license URL in legal notices
dl
parents: 7976
diff changeset
    31
 * http://creativecommons.org/publicdomain/zero/1.0/
7976
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    32
 */
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    33
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    34
/*
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    35
 * @test
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    36
 * @summary stress test for arrivals in a tiered phaser
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    37
 * @run main TieredArriveLoops 300
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    38
 */
34347
4a17f9e90a0f 8142441: Improve jtreg tests for java.util.concurrent
dl
parents: 9242
diff changeset
    39
4a17f9e90a0f 8142441: Improve jtreg tests for java.util.concurrent
dl
parents: 9242
diff changeset
    40
import java.util.concurrent.Phaser;
7976
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    41
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    42
public class TieredArriveLoops {
58138
1e4270f875ee 8225490: Miscellaneous changes imported from jsr166 CVS 2019-09
dl
parents: 47216
diff changeset
    43
    final long testDurationMillisDefault = 10_000L;
7976
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    44
    final long testDurationMillis;
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    45
    final long quittingTimeNanos;
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    46
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    47
    TieredArriveLoops(String[] args) {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    48
        testDurationMillis = (args.length > 0) ?
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    49
            Long.valueOf(args[0]) : testDurationMillisDefault;
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    50
        quittingTimeNanos = System.nanoTime() +
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    51
            testDurationMillis * 1000L * 1000L;
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    52
    }
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    53
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    54
    Runnable runner(final Phaser p) {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    55
        return new CheckedRunnable() { public void realRun() {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    56
            int prevPhase = p.register();
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    57
            while (!p.isTerminated()) {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    58
                int phase = p.awaitAdvance(p.arrive());
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    59
                if (phase < 0)
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    60
                    return;
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    61
                equal(phase, (prevPhase + 1) & Integer.MAX_VALUE);
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    62
                int ph = p.getPhase();
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    63
                check(ph < 0 || ph == phase);
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    64
                prevPhase = phase;
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    65
            }
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    66
        }};
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    67
    }
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    68
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    69
    void test(String[] args) throws Throwable {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    70
        final Phaser parent = new Phaser();
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    71
        final Phaser child1 = new Phaser(parent);
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    72
        final Phaser child2 = new Phaser(parent);
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    73
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    74
        Thread t1 = new Thread(runner(child1));
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    75
        Thread t2 = new Thread(runner(child2));
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    76
        t1.start();
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    77
        t2.start();
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    78
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    79
        for (int prevPhase = 0, phase; ; prevPhase = phase) {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    80
            phase = child2.getPhase();
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    81
            check(phase >= prevPhase);
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    82
            if (System.nanoTime() - quittingTimeNanos > 0) {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    83
                System.err.printf("phase=%d%n", phase);
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    84
                child1.forceTermination();
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    85
                break;
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    86
            }
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    87
        }
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    88
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    89
        t1.join();
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    90
        t2.join();
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    91
    }
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    92
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    93
    //--------------------- Infrastructure ---------------------------
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    94
    volatile int passed = 0, failed = 0;
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    95
    void pass() {passed++;}
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    96
    void fail() {failed++; Thread.dumpStack();}
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    97
    void fail(String msg) {System.err.println(msg); fail();}
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    98
    void unexpected(Throwable t) {failed++; t.printStackTrace();}
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
    99
    void check(boolean cond) {if (cond) pass(); else fail();}
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   100
    void equal(Object x, Object y) {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   101
        if (x == null ? y == null : x.equals(y)) pass();
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   102
        else fail(x + " not equal to " + y);}
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   103
    public static void main(String[] args) throws Throwable {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   104
        new TieredArriveLoops(args).instanceMain(args);}
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   105
    public void instanceMain(String[] args) throws Throwable {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   106
        try {test(args);} catch (Throwable t) {unexpected(t);}
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   107
        System.out.printf("%nPassed = %d, failed = %d%n%n", passed, failed);
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   108
        if (failed > 0) throw new AssertionError("Some tests failed");}
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   109
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   110
    abstract class CheckedRunnable implements Runnable {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   111
        protected abstract void realRun() throws Throwable;
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   112
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   113
        public final void run() {
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   114
            try {realRun();} catch (Throwable t) {unexpected(t);}
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   115
        }
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   116
    }
f273c0d04215 7005424: Resync java.util.concurrent classes with Dougs CVS - Jan 2011
dl
parents:
diff changeset
   117
}