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 */
68f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
78f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepackage jsr166;
88f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
98e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.SECONDS;
108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.Arrays;
128e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.HashSet;
138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CancellationException;
148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ExecutionException;
158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinPool;
168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinTask;
178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinWorkerThread;
188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.RecursiveAction;
198e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.SynchronousQueue;
208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ThreadLocalRandom;
218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.TimeoutException;
228e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test;
248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite;
258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class RecursiveActionTest extends JSR166TestCase {
278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
288e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // android-note: Removed because the CTS runner does a bad job of
298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // retrying tests that have suite() declarations.
308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //
318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static void main(String[] args) {
328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    //     main(suite(), args);
338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // public static Test suite() {
35b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak    //     return new TestSuite(RecursiveActionTest.class);
368e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath    // }
378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath
388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool mainPool() {
398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool();
408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool singletonPool() {
438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool(1);
448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private static ForkJoinPool asyncSingletonPool() {
478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        return new ForkJoinPool(1,
488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                ForkJoinPool.defaultForkJoinWorkerThreadFactory,
498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                                null, true);
508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    private void testInvokeOnPool(ForkJoinPool pool, RecursiveAction a) {
53b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        try (PoolCleaner cleaner = cleaner(pool)) {
548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkNotDone(a);
558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(pool.invoke(a));
578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            checkCompletedNormally(a);
598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkNotDone(RecursiveAction a) {
638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isDone());
648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedAbnormally());
668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getException());
688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        if (! ForkJoinTask.inForkJoinPool()) {
718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try {
738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                a.get();
748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                shouldThrow();
758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (InterruptedException success) {
768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (Throwable fail) { threadUnexpectedException(fail); }
778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Thread.currentThread().interrupt();
798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            try {
808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                a.get(5L, SECONDS);
818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                shouldThrow();
828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (InterruptedException success) {
838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            } catch (Throwable fail) { threadUnexpectedException(fail); }
848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(0L, SECONDS);
888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (TimeoutException success) {
908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCompletedNormally(RecursiveAction a) {
948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedNormally());
978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedAbnormally());
988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getException());
998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.join());
1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(false));
1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(true));
1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.get());
1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertNull(a.get(5L, SECONDS));
1088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCancelled(RecursiveAction a) {
1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCancelled());
1148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedAbnormally());
1168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.getException() instanceof CancellationException);
1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.join();
1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get();
1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(5L, SECONDS);
1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (CancellationException success) {
1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    void checkCompletedAbnormally(RecursiveAction a, Throwable t) {
1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isDone());
1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCancelled());
1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.isCompletedNormally());
1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(a.isCompletedAbnormally());
1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertSame(t.getClass(), a.getException().getClass());
1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.getRawResult());
1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(false));
1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertFalse(a.cancel(true));
1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.join();
1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable expected) {
1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(expected.getClass(), t.getClass());
1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get();
1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(t.getClass(), success.getCause().getClass());
1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        try {
1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            a.get(5L, SECONDS);
1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            shouldThrow();
1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (ExecutionException success) {
1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            assertSame(t.getClass(), success.getCause().getClass());
1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        } catch (Throwable fail) { threadUnexpectedException(fail); }
1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public static final class FJException extends RuntimeException {
1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public FJException() { super(); }
1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public FJException(Throwable cause) { super(cause); }
1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // A simple recursive action for testing
1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    final class FibAction extends CheckedRecursiveAction {
1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int number;
1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int result;
1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        FibAction(int n) { number = n; }
1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected void realCompute() {
1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int n = number;
1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (n <= 1)
1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                result = n;
1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else {
1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f1 = new FibAction(n - 1);
1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f2 = new FibAction(n - 2);
1878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f1, f2);
1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                result = f1.result + f2.result;
1898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    // A recursive action failing in base case
1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static final class FailingFibAction extends RecursiveAction {
1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final int number;
1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        int result;
1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        FailingFibAction(int n) { number = n; }
1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        public void compute() {
1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            int n = number;
2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (n <= 1)
2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                throw new FJException();
2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else {
2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction f1 = new FailingFibAction(n - 1);
2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction f2 = new FailingFibAction(n - 2);
2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f1, f2);
2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                result = f1.result + f2.result;
2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke returns when task completes normally.
2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks. getRawResult of a RecursiveAction returns null;
2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvoke() {
2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.invoke());
2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes normally.
2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * isCompletedAbnormally and isCancelled return false for normally
2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * completed tasks
2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testQuietlyInvoke() {
2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task returns when task completes
2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkJoin() {
2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join/quietlyJoin of a forked task succeeds in the presence of interrupts
2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testJoinIgnoresInterrupts() {
2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
2638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
2648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
2658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                final Thread myself = Thread.currentThread();
2668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                // test join()
2688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
2698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
2708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.interrupted();
2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = new FibAction(8);
2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.cancel(true);
2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Thread.interrupted();
2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = new FibAction(8);
2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.completeExceptionally(new FJException());
2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
2928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
2958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
2968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
2978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Thread.interrupted();
2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                // test quietlyJoin()
3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = new FibAction(8);
3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.interrupted();
3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = new FibAction(8);
3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.cancel(true);
3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.interrupted();
3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCancelled(f);
3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = new FibAction(8);
3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.completeExceptionally(new FJException());
3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                Thread.interrupted();
3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.reinitialize();
3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join/quietlyJoin of a forked task when not in ForkJoinPool
3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * succeeds in the presence of interrupts
3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testJoinIgnoresInterruptsOutsideForkJoinPool() {
3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final SynchronousQueue<FibAction[]> sq =
3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            new SynchronousQueue<FibAction[]>();
3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws InterruptedException {
3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction[] fibActions = new FibAction[6];
3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < fibActions.length; i++)
3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    fibActions[i] = new FibAction(8);
3478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                fibActions[1].cancel(false);
3498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                fibActions[2].completeExceptionally(new FJException());
3508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                fibActions[4].cancel(true);
3518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                fibActions[5].completeExceptionally(new FJException());
3528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < fibActions.length; i++)
3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    fibActions[i].fork();
3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                sq.put(fibActions);
3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Runnable r = new CheckedRunnable() {
3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            public void realRun() throws InterruptedException {
3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction[] fibActions = sq.take();
3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f;
3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                final Thread myself = Thread.currentThread();
3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                // test join() ------------
3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = fibActions[0];
3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(ForkJoinTask.inForkJoinPool());
3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
3728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
3738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
3748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(Thread.interrupted());
3758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
3768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
3778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = fibActions[1];
3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(Thread.interrupted());
3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = fibActions[2];
3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(Thread.interrupted());
3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                // test quietlyJoin() ---------
4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = fibActions[3];
4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(Thread.interrupted());
4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = fibActions[4];
4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(Thread.interrupted());
4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCancelled(f);
4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f = fibActions[5];
4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                myself.interrupt();
4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(myself.isInterrupted());
4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(Thread.interrupted());
4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Thread t;
4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t = newStartedThread(r);
4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
430b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        awaitTermination(t);
4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        a.reinitialize();
4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        t = newStartedThread(r);
4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
435b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak        awaitTermination(t);
4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task returns when task completes
4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkGet() {
4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.get());
4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task returns when task completes
4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkTimedGet() {
4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.get(5L, SECONDS));
4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get with null time unit throws NPE
4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkTimedGetNPE() {
4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(5L, null);
4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (NullPointerException success) {}
4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes
4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkQuietlyJoin() {
4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * helpQuiesce returns when tasks are complete.
5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getQueuedTaskCount returns 0 when quiescent
5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testForkHelpQuiesce() {
5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
5098e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                while (!f.isDone()) // wait out race
5108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    ;
5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, getQueuedTaskCount());
5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task completes abnormally
5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvoke() {
5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction f = new FailingFibAction(8);
5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyInvoke task returns when task completes abnormally
5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalQuietlyInvoke() {
5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction f = new FailingFibAction(8);
5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyInvoke();
5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task completes abnormally
5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkJoin() {
5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction f = new FailingFibAction(8);
5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task completes abnormally
5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkGet() {
5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction f = new FailingFibAction(8);
5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get();
5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task completes abnormally
5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkTimedGet() {
5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction f = new FailingFibAction(8);
5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
5968e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath                    f.get(5L, SECONDS);
5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (ExecutionException success) {
5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    Throwable cause = success.getCause();
6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertTrue(cause instanceof FJException);
6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, cause);
6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task completes abnormally
6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalForkQuietlyJoin() {
6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction f = new FailingFibAction(8);
6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.getException() instanceof FJException);
6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedAbnormally(f, f.getException());
6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception when task cancelled
6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledInvoke() {
6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * join of a forked task throws exception when task cancelled
6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkJoin() {
6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.join();
6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * get of a forked task throws exception when task cancelled
6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkGet() {
6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get();
6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * timed get of a forked task throws exception when task cancelled
6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkTimedGet() {
6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() throws Exception {
6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.get(5L, SECONDS);
6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (CancellationException success) {
6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCancelled(f);
6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * quietlyJoin of a forked task returns when task cancelled
6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCancelledForkQuietlyJoin() {
7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.cancel(true));
7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.quietlyJoin();
7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCancelled(f);
7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPool of executing task returns its pool
7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetPool() {
7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ForkJoinPool mainPool = mainPool();
7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(mainPool, getPool());
7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool, a);
7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPool of non-FJ task returns null
7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetPool2() {
7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(getPool());
7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.invoke());
7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * inForkJoinPool of executing task returns true
7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInForkJoinPool() {
7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(inForkJoinPool());
7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * inForkJoinPool of non-FJ task returns false
7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInForkJoinPool2() {
7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertFalse(inForkJoinPool());
7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.invoke());
7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPool of current thread in pool returns its pool
7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testWorkerGetPool() {
7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ForkJoinPool mainPool = mainPool();
7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                ForkJoinWorkerThread w =
7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    (ForkJoinWorkerThread) Thread.currentThread();
7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(mainPool, w.getPool());
7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool, a);
7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getPoolIndex of current thread in pool returns 0 <= value < poolSize
7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testWorkerGetPoolIndex() {
7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final ForkJoinPool mainPool = mainPool();
7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                ForkJoinWorkerThread w =
7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    (ForkJoinWorkerThread) Thread.currentThread();
7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(w.getPoolIndex() >= 0);
7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                // pool size can shrink after assigning index, so cannot check
7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                // assertTrue(w.getPoolIndex() < mainPool.getPoolSize());
7838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool, a);
7858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
7888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * setRawResult(null) succeeds
7898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
7908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSetRawResult() {
7918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
7928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
7938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                setRawResult(null);
7948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(getRawResult());
7958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
7968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertNull(a.invoke());
7978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
7988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
7998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A reinitialized normally completed task may be re-invoked
8018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testReinitialize() {
8038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
8048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
8068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
8078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < 3; i++) {
8098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertNull(f.invoke());
8108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    assertEquals(21, f.result);
8118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedNormally(f);
8128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.reinitialize();
8138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkNotDone(f);
8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
8158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * A reinitialized abnormally completed task may be re-invoked
8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testReinitializeAbnormal() {
8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
8248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction f = new FailingFibAction(8);
8268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
8278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                for (int i = 0; i < 3; i++) {
8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    try {
8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        f.invoke();
8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        shouldThrow();
8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    } catch (FJException success) {
8338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                        checkCompletedAbnormally(f, success);
8348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    }
8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.reinitialize();
8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkNotDone(f);
8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task throws exception after invoking completeExceptionally
8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testCompleteExceptionally() {
8468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.completeExceptionally(new FJException());
8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    f.invoke();
8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invoke task suppresses execution invoking complete
8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testComplete() {
8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                f.complete(null);
8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.invoke());
8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, f.result);
8708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) invokes all task arguments
8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll2() {
8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
8828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
8838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g);
8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.result);
8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument invokes task
8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll1() {
8968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
8978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
8988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f);
9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument invokes tasks
9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAll3() {
9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
9148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction h = new FibAction(7);
9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(f, g, h);
9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.isDone());
9178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(g.isDone());
9188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(h.isDone());
9198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
9208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
9218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
9228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.result);
9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(13, h.result);
9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(collection) invokes all tasks in the collection
9318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllCollection() {
9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction h = new FibAction(7);
9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                HashSet set = new HashSet();
9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(f);
9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(g);
9418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(h);
9428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(set);
9438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.isDone());
9448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(g.isDone());
9458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(h.isDone());
9468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
9478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(21, f.result);
9488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
9498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(34, g.result);
9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(13, h.result);
9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with any null task throws NPE
9588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testInvokeAllNPE() {
9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
9638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
9648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction h = null;
9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
9668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g, h);
9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (NullPointerException success) {}
9698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(t1, t2) throw exception if any task does
9758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll2() {
9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction g = new FailingFibAction(9);
9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g);
9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
9848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
9858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
9868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
9878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
9888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
9898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
9908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
9918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
9928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with 1 argument throws exception if task does
9938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
9948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll1() {
9958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction g = new FailingFibAction(9);
9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(g);
10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
10038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
10048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(tasks) with > 2 argument throws exception if any task does
10108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAll3() {
10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction g = new FailingFibAction(9);
10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction h = new FibAction(7);
10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(f, g, h);
10198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
10208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
10218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(g, success);
10228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
10238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * invokeAll(collection) throws exception if any task does
10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testAbnormalInvokeAllCollection() {
10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
10328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FailingFibAction f = new FailingFibAction(8);
10348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
10358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction h = new FibAction(7);
10368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                HashSet set = new HashSet();
10378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(f);
10388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(g);
10398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                set.add(h);
10408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                try {
10418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    invokeAll(set);
10428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    shouldThrow();
10438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                } catch (FJException success) {
10448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    checkCompletedAbnormally(f, success);
10458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                }
10468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), a);
10488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * tryUnfork returns true for most recent unexecuted task,
10528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * and suppresses execution
10538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testTryUnfork() {
10558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
10568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
10588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
10598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
10608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
10618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(f.tryUnfork());
10628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
10638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
10648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
10658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
10678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * getSurplusQueuedTaskCount returns > 0 when
10718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * there are more tasks than threads
10728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testGetSurplusQueuedTaskCount() {
10748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
10758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction h = new FibAction(7);
10778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(h, h.fork());
10788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
10798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
10808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
10818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
10828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertTrue(getSurplusQueuedTaskCount() > 0);
10838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
10848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertEquals(0, getSurplusQueuedTaskCount());
10858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
10868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
10878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(h);
10888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
10898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
10908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
10918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
10928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
10938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekNextLocalTask returns most recent unexecuted task.
10948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
10958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeekNextLocalTask() {
10968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
10978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
10988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
10998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
11008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
11018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
11028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, peekNextLocalTask());
11038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
11048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
11058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
11068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
11078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
11088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
11108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollNextLocalTask returns most recent unexecuted task
11148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * without executing it
11158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollNextLocalTask() {
11178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
11188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
11208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
11218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
11228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
11238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, pollNextLocalTask());
11248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
11258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
11268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
11278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
11298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollTask returns an unexecuted task without executing it
11338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollTask() {
11358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
11368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
11388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
11398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
11408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
11418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, pollTask());
11428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
11438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(f);
11448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
11458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(singletonPool(), a);
11478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * peekNextLocalTask returns least recent unexecuted task in async mode
11518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPeekNextLocalTaskAsync() {
11538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
11548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
11568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
11578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
11588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
11598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, peekNextLocalTask());
11608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertNull(f.join());
11618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
11628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
11638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(g);
11648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(asyncSingletonPool(), a);
11668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollNextLocalTask returns least recent unexecuted task without
11708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * executing it, in async mode
11718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollNextLocalTaskAsync() {
11738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
11748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
11768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
11778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
11788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
11798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, pollNextLocalTask());
11808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
11818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
11828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(g);
11838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
11848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(asyncSingletonPool(), a);
11858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
11868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
11878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
11888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * pollTask returns an unexecuted task without executing it, in
11898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * async mode
11908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
11918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testPollTaskAsync() {
11928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        RecursiveAction a = new CheckedRecursiveAction() {
11938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            protected void realCompute() {
11948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction g = new FibAction(9);
11958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, g.fork());
11968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                FibAction f = new FibAction(8);
11978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(f, f.fork());
11988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                assertSame(g, pollTask());
11998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                helpQuiesce();
12008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkCompletedNormally(f);
12018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                checkNotDone(g);
12028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }};
12038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(asyncSingletonPool(), a);
12048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /** Demo from RecursiveAction javadoc */
12078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    static class SortTask extends RecursiveAction {
12088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        final long[] array; final int lo, hi;
12098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SortTask(long[] array, int lo, int hi) {
12108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            this.array = array; this.lo = lo; this.hi = hi;
12118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        SortTask(long[] array) { this(array, 0, array.length); }
12138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        protected void compute() {
12148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            if (hi - lo < THRESHOLD)
12158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                sortSequentially(lo, hi);
12168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            else {
12178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                int mid = (lo + hi) >>> 1;
12188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                invokeAll(new SortTask(array, lo, mid),
12198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                          new SortTask(array, mid, hi));
12208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                merge(lo, mid, hi);
12218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            }
12228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        // implementation details follow:
12248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        static final int THRESHOLD = 100;
12258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        void sortSequentially(int lo, int hi) {
12268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            Arrays.sort(array, lo, hi);
12278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        void merge(int lo, int mid, int hi) {
12298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            long[] buf = Arrays.copyOfRange(array, lo, mid);
12308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            for (int i = 0, j = lo, k = mid; i < buf.length; j++)
12318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                array[j] = (k == hi || buf[i] < array[k]) ?
12328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle                    buf[i++] : array[k++];
12338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        }
12348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle
12368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    /**
12378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     * SortTask demo works as advertised
12388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle     */
12398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    public void testSortTaskDemo() {
12408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        ThreadLocalRandom rnd = ThreadLocalRandom.current();
12418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long[] array = new long[1007];
12428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        for (int i = 0; i < array.length; i++)
12438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle            array[i] = rnd.nextLong();
12448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        long[] arrayClone = array.clone();
12458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        testInvokeOnPool(mainPool(), new SortTask(array));
12468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        Arrays.sort(arrayClone);
12478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle        assertTrue(Arrays.equals(array, arrayClone));
12488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle    }
12498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle}
1250