18f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle/*
28f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Written by Doug Lea with assistance from members of JCP JSR-166
38f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Expert Group and released to the public domain, as explained at
48f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * http://creativecommons.org/publicdomain/zero/1.0/
58f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Other contributors include John Vint
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.MILLISECONDS;
118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.ArrayList;
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.List;
148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CountDownLatch;
158e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.Phaser;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.TimeoutException;
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicInteger;
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
208e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite;
218e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class PhaserTest extends JSR166TestCase {
238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // android-note: Removed because the CTS runner does a bad job of
258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // retrying tests that have suite() declarations.
268e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
278e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
31e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak    //     return new TestSuite(PhaserTest.class);
328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static final int maxParties = 65535;
358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /** Checks state of unterminated phaser. */
378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    protected void assertState(Phaser phaser,
388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                               int phase, int parties, int unarrived) {
398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(phase, phaser.getPhase());
408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(parties, phaser.getRegisteredParties());
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(unarrived, phaser.getUnarrivedParties());
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(parties - unarrived, phaser.getArrivedParties());
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(phaser.isTerminated());
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /** Checks state of terminated phaser. */
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    protected void assertTerminated(Phaser phaser, int maxPhase, int parties) {
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(phaser.isTerminated());
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int expectedPhase = maxPhase + Integer.MIN_VALUE;
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(expectedPhase, phaser.getPhase());
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(parties, phaser.getRegisteredParties());
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(expectedPhase, phaser.register());
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(expectedPhase, phaser.arrive());
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(expectedPhase, phaser.arriveAndDeregister());
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    protected void assertTerminated(Phaser phaser, int maxPhase) {
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(phaser, maxPhase, 0);
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Empty constructor builds a new Phaser with no parent, no registered
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * parties and initial phase number of 0
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorDefaultValues() {
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser phaser = new Phaser();
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(phaser.getParent());
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.getRegisteredParties());
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.getArrivedParties());
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.getUnarrivedParties());
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.getPhase());
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructing with a negative number of parties throws
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * IllegalArgumentException
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorNegativeParties() {
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new Phaser(-1);
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructing with a negative number of parties throws
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * IllegalArgumentException
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorNegativeParties2() {
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new Phaser(new Phaser(), -1);
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Constructing with a number of parties > 65535 throws
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * IllegalArgumentException
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructorPartiesExceedsLimit() {
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        new Phaser(maxParties);
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new Phaser(maxParties + 1);
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        new Phaser(new Phaser(), maxParties);
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new Phaser(new Phaser(), maxParties + 1);
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * The parent provided to the constructor should be returned from
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * a later call to getParent
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor3() {
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser parent = new Phaser();
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(parent, new Phaser(parent).getParent());
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(new Phaser(null).getParent());
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * The parent being input into the parameter should equal the original
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * parent when being returned
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor5() {
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser parent = new Phaser();
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(parent, new Phaser(parent, 0).getParent());
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(new Phaser(null, 0).getParent());
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * register() will increment the number of unarrived parties by
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * one and not affect its arrived parties
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRegister1() {
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser phaser = new Phaser();
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, 0, 0);
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.register());
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, 1, 1);
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Registering more than 65536 parties causes IllegalStateException
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRegister2() {
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser phaser = new Phaser(0);
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, 0, 0);
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.bulkRegister(maxParties - 10));
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, maxParties - 10, maxParties - 10);
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 10; i++) {
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertState(phaser, 0, maxParties - 10 + i, maxParties - 10 + i);
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, phaser.register());
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, maxParties, maxParties);
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            phaser.register();
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            phaser.bulkRegister(Integer.MAX_VALUE);
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.bulkRegister(0));
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, maxParties, maxParties);
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * register() correctly returns the current barrier phase number
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * when invoked
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRegister3() {
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser phaser = new Phaser();
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.register());
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.arrive());
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.register());
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 1, 2, 2);
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * register causes the next arrive to not increment the phase
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * rather retain the phase number
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRegister4() {
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser phaser = new Phaser(1);
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.arrive());
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.register());
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.arrive());
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 1, 2, 1);
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * register on a subphaser that is currently empty succeeds, even
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * in the presence of another non-empty subphaser
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testRegisterEmptySubPhaser() {
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser root = new Phaser();
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser child1 = new Phaser(root, 1);
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser child2 = new Phaser(root, 0);
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, child2.register());
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(root, 0, 2, 2);
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child1, 0, 1, 1);
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child2, 0, 1, 1);
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, child2.arriveAndDeregister());
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(root, 0, 1, 1);
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child1, 0, 1, 1);
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child2, 0, 0, 0);
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, child2.register());
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, child2.arriveAndDeregister());
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(root, 0, 1, 1);
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child1, 0, 1, 1);
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child2, 0, 0, 0);
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, child1.arriveAndDeregister());
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(root, 1);
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(child1, 1);
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(child2, 1);
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Invoking bulkRegister with a negative parameter throws an
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * IllegalArgumentException
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBulkRegister1() {
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new Phaser().bulkRegister(-1);
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * bulkRegister should correctly record the number of unarrived
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * parties with the number of parties being registered
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBulkRegister2() {
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser phaser = new Phaser();
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.bulkRegister(0));
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, 0, 0);
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.bulkRegister(20));
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, 20, 20);
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Registering with a number of parties greater than or equal to 1<<16
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * throws IllegalStateException.
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBulkRegister3() {
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, new Phaser().bulkRegister((1 << 16) - 1));
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new Phaser().bulkRegister(1 << 16);
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new Phaser(2).bulkRegister((1 << 16) - 2);
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * the phase number increments correctly when tripping the barrier
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPhaseIncrement1() {
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int size = 1; size < nine; size++) {
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final Phaser phaser = new Phaser(size);
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int index = 0; index <= (1 << size); index++) {
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                int phase = phaser.arrive();
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(index % size == 0 ? (index / size) == phase : index - (phase * size) > 0);
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arrive() on a registered phaser increments phase.
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArrive1() {
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser phaser = new Phaser(1);
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, 1, 1);
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.arrive());
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 1, 1, 1);
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndDeregister does not wait for others to arrive at barrier
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArriveAndDeregister() {
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser(1);
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 10; i++) {
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertState(phaser, 0, 1, 1);
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, phaser.register());
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertState(phaser, 0, 2, 2);
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, phaser.arriveAndDeregister());
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertState(phaser, 0, 1, 1);
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.arriveAndDeregister());
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(phaser, 1);
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndDeregister does not wait for others to arrive at barrier
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArrive2() {
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser();
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.register());
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Thread> threads = new ArrayList<Thread>();
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 10; i++) {
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, phaser.register());
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threads.add(newStartedThread(new CheckedRunnable() {
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(0, phaser.arriveAndDeregister());
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }}));
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Thread thread : threads)
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(thread);
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, 1, 1);
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.arrive());
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 1, 1, 1);
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arrive() returns a negative number if the Phaser is terminated
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArrive3() {
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser phaser = new Phaser(1);
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        phaser.forceTermination();
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(phaser, 0, 1);
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.getPhase() + Integer.MIN_VALUE);
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(phaser.arrive() < 0);
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(phaser.register() < 0);
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(phaser.arriveAndDeregister() < 0);
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(phaser.awaitAdvance(1) < 0);
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(phaser.getPhase() < 0);
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndDeregister() throws IllegalStateException if number of
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * registered or unarrived parties would become negative
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArriveAndDeregister1() {
345e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        Phaser phaser = new Phaser();
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            phaser.arriveAndDeregister();
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndDeregister reduces the number of arrived parties
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArriveAndDeregister2() {
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser(1);
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.register());
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.arrive());
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, 2, 1);
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.arriveAndDeregister());
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 1, 1, 1);
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndDeregister arrives at the barrier on a phaser with a parent and
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * when a deregistration occurs and causes the phaser to have zero parties
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * its parent will be deregistered as well
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArriveAndDeregister3() {
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser parent = new Phaser();
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser child = new Phaser(parent);
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child, 0, 0, 0);
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(parent, 0, 0, 0);
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, child.register());
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child, 0, 1, 1);
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(parent, 0, 1, 1);
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, child.arriveAndDeregister());
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(child, 1);
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(parent, 1);
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndDeregister deregisters one party from its parent when
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * the number of parties of child is zero after deregistration
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArriveAndDeregister4() {
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser parent = new Phaser();
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser child = new Phaser(parent);
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, parent.register());
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, child.register());
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child, 0, 1, 1);
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(parent, 0, 2, 2);
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, child.arriveAndDeregister());
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child, 0, 0, 0);
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(parent, 0, 1, 1);
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndDeregister deregisters one party from its parent when
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * the number of parties of root is nonzero after deregistration.
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArriveAndDeregister5() {
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser root = new Phaser();
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser parent = new Phaser(root);
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser child = new Phaser(parent);
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(root, 0, 0, 0);
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(parent, 0, 0, 0);
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child, 0, 0, 0);
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, child.register());
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(root, 0, 1, 1);
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(parent, 0, 1, 1);
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(child, 0, 1, 1);
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, child.arriveAndDeregister());
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(child, 1);
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(parent, 1);
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(root, 1);
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndDeregister returns the phase in which it leaves the
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * phaser in after deregistration
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArriveAndDeregister6() {
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser(2);
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, phaser.arrive());
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.arriveAndAwaitAdvance());
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 1, 2, 2);
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.arriveAndDeregister());
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 1, 1, 1);
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.arriveAndDeregister());
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTerminated(phaser, 2);
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * awaitAdvance succeeds upon advance
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwaitAdvance1() {
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser(1);
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.arrive());
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.awaitAdvance(0));
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * awaitAdvance with a negative parameter will return without affecting the
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * phaser
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwaitAdvance2() {
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Phaser phaser = new Phaser();
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(phaser.awaitAdvance(-1) < 0);
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, 0, 0);
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * awaitAdvanceInterruptibly blocks interruptibly
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwaitAdvanceInterruptibly_interruptible() throws InterruptedException {
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser(1);
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(2);
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t1 = newStartedThread(new CheckedRunnable() {
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    phaser.awaitAdvanceInterruptibly(0);
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    phaser.awaitAdvanceInterruptibly(0);
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t2 = newStartedThread(new CheckedRunnable() {
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws TimeoutException {
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    phaser.awaitAdvanceInterruptibly(0, 2*LONG_DELAY_MS, MILLISECONDS);
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    phaser.awaitAdvanceInterruptibly(0, 2*LONG_DELAY_MS, MILLISECONDS);
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (InterruptedException success) {}
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.interrupted());
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, 1, 1);
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertThreadsStayAlive(t1, t2);
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t1.interrupt();
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t2.interrupt();
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t1);
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t2);
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, 1, 1);
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.arrive());
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 1, 1, 1);
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * awaitAdvance continues waiting if interrupted before waiting
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwaitAdvanceAfterInterrupt() {
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser();
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.register());
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseArrive = new CountDownLatch(1);
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, phaser.register());
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, phaser.arrive());
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseArrive.countDown();
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(Thread.currentThread().isInterrupted());
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(1, phaser.awaitAdvance(0));
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(Thread.interrupted());
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseArrive);
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        waitForThreadToEnterWaitState(t, SHORT_DELAY_MS);
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.arrive());
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread.currentThread().interrupt();
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.awaitAdvance(0));
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(Thread.interrupted());
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     *  awaitAdvance continues waiting if interrupted while waiting
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwaitAdvanceBeforeInterrupt() {
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser();
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.register());
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseArrive = new CountDownLatch(1);
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, phaser.register());
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, phaser.arrive());
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.currentThread().isInterrupted());
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseArrive.countDown();
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(1, phaser.awaitAdvance(0));
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(Thread.interrupted());
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseArrive);
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        waitForThreadToEnterWaitState(t, SHORT_DELAY_MS);
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.arrive());
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread.currentThread().interrupt();
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.awaitAdvance(0));
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(Thread.interrupted());
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndAwaitAdvance continues waiting if interrupted before waiting
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArriveAndAwaitAdvanceAfterInterrupt() {
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser();
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.register());
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.currentThread().interrupt();
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, phaser.register());
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(Thread.currentThread().isInterrupted());
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(1, phaser.arriveAndAwaitAdvance());
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(Thread.currentThread().isInterrupted());
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        waitForThreadToEnterWaitState(t, SHORT_DELAY_MS);
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread.currentThread().interrupt();
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.arriveAndAwaitAdvance());
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(Thread.interrupted());
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndAwaitAdvance continues waiting if interrupted while waiting
5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArriveAndAwaitAdvanceBeforeInterrupt() {
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser();
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.register());
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(1);
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, phaser.register());
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(Thread.currentThread().isInterrupted());
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(1, phaser.arriveAndAwaitAdvance());
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(Thread.currentThread().isInterrupted());
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        waitForThreadToEnterWaitState(t, SHORT_DELAY_MS);
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread.currentThread().interrupt();
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.arriveAndAwaitAdvance());
6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(Thread.interrupted());
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * awaitAdvance atomically waits for all parties within the same phase to
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * complete before continuing
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwaitAdvance4() {
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser(4);
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final AtomicInteger count = new AtomicInteger(0);
6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Thread> threads = new ArrayList<Thread>();
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 4; i++)
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threads.add(newStartedThread(new CheckedRunnable() {
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    for (int k = 0; k < 3; k++) {
632e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                        assertEquals(2 * k + 1, phaser.arriveAndAwaitAdvance());
6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        count.incrementAndGet();
634e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                        assertEquals(2 * k + 1, phaser.arrive());
635e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                        assertEquals(2 * k + 2, phaser.awaitAdvance(2 * k + 1));
636e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak                        assertEquals(4 * (k + 1), count.get());
6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }}}));
6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Thread thread : threads)
6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(thread);
6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * awaitAdvance returns the current phase
6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwaitAdvance5() {
6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser(1);
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.awaitAdvance(phaser.arrive()));
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.getPhase());
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, phaser.register());
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        List<Thread> threads = new ArrayList<Thread>();
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 8; i++) {
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final CountDownLatch latch = new CountDownLatch(1);
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final boolean goesFirst = ((i & 1) == 0);
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threads.add(newStartedThread(new CheckedRunnable() {
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    if (goesFirst)
6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        latch.countDown();
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    else
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        await(latch);
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    phaser.arrive();
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }}));
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (goesFirst)
6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                await(latch);
6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                latch.countDown();
6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i + 2, phaser.awaitAdvance(phaser.arrive()));
6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(i + 2, phaser.getPhase());
6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Thread thread : threads)
6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(thread);
6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * awaitAdvance returns the current phase in child phasers
6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwaitAdvanceTieredPhaser() throws Exception {
6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser parent = new Phaser();
6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final List<Phaser> zeroPartyChildren = new ArrayList<Phaser>(3);
6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final List<Phaser> onePartyChildren = new ArrayList<Phaser>(3);
6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 3; i++) {
6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            zeroPartyChildren.add(new Phaser(parent, 0));
6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            onePartyChildren.add(new Phaser(parent, 1));
6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final List<Phaser> phasers = new ArrayList<Phaser>();
6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        phasers.addAll(zeroPartyChildren);
6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        phasers.addAll(onePartyChildren);
6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        phasers.add(parent);
6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Phaser phaser : phasers) {
6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(-42, phaser.awaitAdvance(-42));
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42));
692e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42, MEDIUM_DELAY_MS, MILLISECONDS));
6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Phaser child : onePartyChildren)
6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, child.arrive());
6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Phaser phaser : phasers) {
6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(-42, phaser.awaitAdvance(-42));
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42));
700e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42, MEDIUM_DELAY_MS, MILLISECONDS));
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, phaser.awaitAdvance(0));
7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, phaser.awaitAdvanceInterruptibly(0));
703e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(1, phaser.awaitAdvanceInterruptibly(0, MEDIUM_DELAY_MS, MILLISECONDS));
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Phaser child : onePartyChildren)
7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(1, child.arrive());
7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Phaser phaser : phasers) {
7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(-42, phaser.awaitAdvance(-42));
7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42));
711e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(-42, phaser.awaitAdvanceInterruptibly(-42, MEDIUM_DELAY_MS, MILLISECONDS));
7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(2, phaser.awaitAdvance(0));
7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(2, phaser.awaitAdvanceInterruptibly(0));
714e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(2, phaser.awaitAdvanceInterruptibly(0, MEDIUM_DELAY_MS, MILLISECONDS));
7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(2, phaser.awaitAdvance(1));
7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(2, phaser.awaitAdvanceInterruptibly(1));
717e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak            assertEquals(2, phaser.awaitAdvanceInterruptibly(1, MEDIUM_DELAY_MS, MILLISECONDS));
7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * awaitAdvance returns when the phaser is externally terminated
7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwaitAdvance6() {
7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser(3);
7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseForceTermination = new CountDownLatch(2);
7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final List<Thread> threads = new ArrayList<Thread>();
7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 2; i++) {
7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Runnable r = new CheckedRunnable() {
7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(0, phaser.arrive());
7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    pleaseForceTermination.countDown();
7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(phaser.awaitAdvance(0) < 0);
7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(phaser.isTerminated());
7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(phaser.getPhase() < 0);
7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(0, phaser.getPhase() + Integer.MIN_VALUE);
7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(3, phaser.getRegisteredParties());
7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threads.add(newStartedThread(r));
7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseForceTermination);
7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        phaser.forceTermination();
7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(phaser.isTerminated());
7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, phaser.getPhase() + Integer.MIN_VALUE);
7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Thread thread : threads)
7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(thread);
7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(3, phaser.getRegisteredParties());
7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndAwaitAdvance throws IllegalStateException with no
7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * unarrived parties
7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArriveAndAwaitAdvance1() {
755e8b323c7cb7d55be9a4df579231e44f04f53d766Przemyslaw Szczepaniak        Phaser phaser = new Phaser();
7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            phaser.arriveAndAwaitAdvance();
7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalStateException success) {}
7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * arriveAndAwaitAdvance waits for all threads to arrive, the
7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * number of arrived parties is the same number that is accounted
7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * for when the main thread awaitsAdvance
7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testArriveAndAwaitAdvance3() {
7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final Phaser phaser = new Phaser(1);
7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int THREADS = 3;
7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseArrive = new CountDownLatch(THREADS);
7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final List<Thread> threads = new ArrayList<Thread>();
7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < THREADS; i++)
7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            threads.add(newStartedThread(new CheckedRunnable() {
7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() {
7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(0, phaser.register());
7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    pleaseArrive.countDown();
7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(1, phaser.arriveAndAwaitAdvance());
7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }}));
7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseArrive);
7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (phaser.getArrivedParties() < THREADS)
7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.yield();
7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(THREADS, phaser.getArrivedParties());
7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(millisElapsedSince(startTime) < LONG_DELAY_MS);
7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Thread thread : threads)
7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            waitForThreadToEnterWaitState(thread, SHORT_DELAY_MS);
7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Thread thread : threads)
7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(thread.isAlive());
7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 0, THREADS + 1, 1);
7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        phaser.arriveAndAwaitAdvance();
7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (Thread thread : threads)
7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(thread);
7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertState(phaser, 1, THREADS + 1, THREADS + 1);
7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
798