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 Andrew Wright, Jeffrey Hayes,
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Pat Fisher, Mike Judd.
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
98f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport junit.framework.*;
128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.*;
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.BrokenBarrierException;
148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CountDownLatch;
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CyclicBarrier;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.TimeoutException;
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicBoolean;
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport static java.util.concurrent.TimeUnit.MILLISECONDS;
198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class CyclicBarrierTest extends JSR166TestCase {
218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private volatile int countAction;
238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private class MyAction implements Runnable {
248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public void run() { ++countAction; }
258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Spin-waits till the number of waiters == numberOfWaiters.
298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void awaitNumberWaiting(CyclicBarrier barrier, int numberOfWaiters) {
318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long startTime = System.nanoTime();
328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        while (barrier.getNumberWaiting() != numberOfWaiters) {
338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (millisElapsedSince(startTime) > LONG_DELAY_MS)
348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                fail("timed out");
358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.yield();
368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Creating with negative parties throws IAE
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor1() {
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new CyclicBarrier(-1, (Runnable)null);
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Creating with negative parties and no action throws IAE
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testConstructor2() {
538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new CyclicBarrier(-1);
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (IllegalArgumentException success) {}
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getParties returns the number of parties given in constructor
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetParties() {
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CyclicBarrier b = new CyclicBarrier(2);
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, b.getParties());
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, b.getNumberWaiting());
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A 1-party barrier triggers after single await
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSingleParty() throws Exception {
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CyclicBarrier b = new CyclicBarrier(1);
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, b.getParties());
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, b.getNumberWaiting());
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.await();
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.await();
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, b.getNumberWaiting());
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * The supplied barrier action is run at barrier
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testBarrierAction() throws Exception {
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        countAction = 0;
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        CyclicBarrier b = new CyclicBarrier(1, new MyAction());
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(1, b.getParties());
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, b.getNumberWaiting());
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.await();
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.await();
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(0, b.getNumberWaiting());
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertEquals(2, countAction);
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A 2-party/thread barrier triggers after both threads invoke await
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTwoParties() throws Exception {
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier b = new CyclicBarrier(2);
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                b.await();
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                b.await();
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                b.await();
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                b.await();
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.await();
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.await();
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.await();
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        b.await();
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * An interruption in one party causes others waiting in await to
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * throw BrokenBarrierException
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwait1_Interrupted_BrokenBarrier() {
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier c = new CyclicBarrier(3);
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(2);
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t1 = new ThreadShouldThrow(InterruptedException.class) {
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                c.await();
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                c.await();
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t1.start();
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t2.start();
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t1.interrupt();
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t1);
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t2);
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * An interruption in one party causes others waiting in timed await to
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * throw BrokenBarrierException
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwait2_Interrupted_BrokenBarrier() throws Exception {
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier c = new CyclicBarrier(3);
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseInterrupt = new CountDownLatch(2);
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t1 = new ThreadShouldThrow(InterruptedException.class) {
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                c.await(LONG_DELAY_MS, MILLISECONDS);
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseInterrupt.countDown();
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                c.await(LONG_DELAY_MS, MILLISECONDS);
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t1.start();
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t2.start();
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseInterrupt);
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t1.interrupt();
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t1);
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t2);
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A timeout in timed await throws TimeoutException
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwait3_TimeoutException() throws InterruptedException {
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier c = new CyclicBarrier(2);
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    c.await(timeoutMillis(), MILLISECONDS);
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (TimeoutException success) {}
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A timeout in one party causes others waiting in timed await to
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * throw BrokenBarrierException
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwait4_Timeout_BrokenBarrier() throws InterruptedException {
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier c = new CyclicBarrier(3);
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t1 = newStartedThread(new CheckedRunnable() {
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    c.await(LONG_DELAY_MS, MILLISECONDS);
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (BrokenBarrierException success) {}
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t2 = newStartedThread(new CheckedRunnable() {
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                awaitNumberWaiting(c, 1);
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    c.await(timeoutMillis(), MILLISECONDS);
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (TimeoutException success) {}
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t1);
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t2);
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A timeout in one party causes others waiting in await to
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * throw BrokenBarrierException
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAwait5_Timeout_BrokenBarrier() throws InterruptedException {
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier c = new CyclicBarrier(3);
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t1 = newStartedThread(new CheckedRunnable() {
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    c.await();
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (BrokenBarrierException success) {}
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t2 = newStartedThread(new CheckedRunnable() {
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                awaitNumberWaiting(c, 1);
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                long startTime = System.nanoTime();
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    c.await(timeoutMillis(), MILLISECONDS);
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (TimeoutException success) {}
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t1);
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t2);
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A reset of an active barrier causes waiting threads to throw
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * BrokenBarrierException
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testReset_BrokenBarrier() throws InterruptedException {
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier c = new CyclicBarrier(3);
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CountDownLatch pleaseReset = new CountDownLatch(2);
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t1 = new ThreadShouldThrow(BrokenBarrierException.class) {
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseReset.countDown();
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                c.await();
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                pleaseReset.countDown();
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                c.await();
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t1.start();
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t2.start();
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        await(pleaseReset);
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitNumberWaiting(c, 2);
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        c.reset();
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t1);
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t2);
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A reset before threads enter barrier does not throw
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * BrokenBarrierException
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testReset_NoBrokenBarrier() throws Exception {
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier c = new CyclicBarrier(3);
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        c.reset();
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t1 = newStartedThread(new CheckedRunnable() {
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                c.await();
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t2 = newStartedThread(new CheckedRunnable() {
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws Exception {
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                c.await();
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }});
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        c.await();
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t1);
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t2);
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * All threads block while a barrier is broken.
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testReset_Leakage() throws InterruptedException {
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier c = new CyclicBarrier(2);
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final AtomicBoolean done = new AtomicBoolean();
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t = newStartedThread(new CheckedRunnable() {
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() {
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                while (!done.get()) {
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    try {
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        while (c.isBroken())
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                            c.reset();
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        c.await();
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        shouldThrow();
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    catch (BrokenBarrierException ok) {}
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    catch (InterruptedException ok) {}
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }}});
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 4; i++) {
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            delay(timeoutMillis());
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            t.interrupt();
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        done.set(true);
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t.interrupt();
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        awaitTermination(t);
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Reset of a non-broken barrier does not break barrier
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testResetWithoutBreakage() throws Exception {
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier barrier = new CyclicBarrier(3);
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 3; i++) {
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final CyclicBarrier start = new CyclicBarrier(3);
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread t1 = newStartedThread(new CheckedRunnable() {
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws Exception {
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    start.await();
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    barrier.await();
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread t2 = newStartedThread(new CheckedRunnable() {
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws Exception {
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    start.await();
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    barrier.await();
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            start.await();
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            barrier.await();
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(t1);
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(t2);
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(barrier.isBroken());
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, barrier.getNumberWaiting());
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (i == 1) barrier.reset();
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(barrier.isBroken());
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, barrier.getNumberWaiting());
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Reset of a barrier after interruption reinitializes it.
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testResetAfterInterrupt() throws Exception {
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier barrier = new CyclicBarrier(3);
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 2; i++) {
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final CyclicBarrier start = new CyclicBarrier(3);
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread t1 = new ThreadShouldThrow(InterruptedException.class) {
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws Exception {
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    start.await();
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    barrier.await();
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws Exception {
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    start.await();
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    barrier.await();
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            t1.start();
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            t2.start();
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            start.await();
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            t1.interrupt();
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(t1);
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(t2);
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(barrier.isBroken());
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, barrier.getNumberWaiting());
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            barrier.reset();
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(barrier.isBroken());
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, barrier.getNumberWaiting());
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Reset of a barrier after timeout reinitializes it.
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testResetAfterTimeout() throws Exception {
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier barrier = new CyclicBarrier(3);
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 2; i++) {
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, barrier.getNumberWaiting());
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread t1 = newStartedThread(new CheckedRunnable() {
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws Exception {
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    try {
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        barrier.await();
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        shouldThrow();
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    } catch (BrokenBarrierException success) {}
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread t2 = newStartedThread(new CheckedRunnable() {
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws Exception {
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    awaitNumberWaiting(barrier, 1);
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    long startTime = System.nanoTime();
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    try {
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        barrier.await(timeoutMillis(), MILLISECONDS);
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        shouldThrow();
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    } catch (TimeoutException success) {}
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(millisElapsedSince(startTime) >= timeoutMillis());
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }});
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(t1);
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(t2);
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, barrier.getNumberWaiting());
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(barrier.isBroken());
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, barrier.getNumberWaiting());
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            barrier.reset();
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(barrier.isBroken());
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, barrier.getNumberWaiting());
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * Reset of a barrier after a failed command reinitializes it.
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testResetAfterCommandException() throws Exception {
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final CyclicBarrier barrier =
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new CyclicBarrier(3, new Runnable() {
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    public void run() {
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        throw new NullPointerException(); }});
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < 2; i++) {
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            final CyclicBarrier start = new CyclicBarrier(3);
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread t1 = new ThreadShouldThrow(BrokenBarrierException.class) {
4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws Exception {
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    start.await();
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    barrier.await();
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread t2 = new ThreadShouldThrow(BrokenBarrierException.class) {
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                public void realRun() throws Exception {
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    start.await();
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    barrier.await();
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }};
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            t1.start();
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            t2.start();
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            start.await();
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitNumberWaiting(barrier, 2);
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try {
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                barrier.await();
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                shouldThrow();
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (NullPointerException success) {}
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(t1);
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            awaitTermination(t2);
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertTrue(barrier.isBroken());
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, barrier.getNumberWaiting());
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            barrier.reset();
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertFalse(barrier.isBroken());
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertEquals(0, barrier.getNumberWaiting());
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
459