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.MILLISECONDS; 108e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport static java.util.concurrent.TimeUnit.SECONDS; 118e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 12b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.Arrays; 13b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.Collections; 148e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.HashSet; 15b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniakimport java.util.List; 168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.CancellationException; 178e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport java.util.concurrent.ExecutionException; 188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinPool; 198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.ForkJoinTask; 208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.RecursiveAction; 218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.TimeoutException; 228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravleimport java.util.concurrent.atomic.AtomicIntegerFieldUpdater; 238e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.Test; 258e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamathimport junit.framework.TestSuite; 268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravlepublic class ForkJoinTaskTest extends JSR166TestCase { 288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 298e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // android-note: Removed because the CTS runner does a bad job of 308e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // retrying tests that have suite() declarations. 318e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // 328e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static void main(String[] args) { 338e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // main(suite(), args); 348e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 358e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // public static Test suite() { 36b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak // return new TestSuite(ForkJoinTaskTest.class); 378e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath // } 388e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // Runs with "mainPool" use > 1 thread. singletonPool tests use 1 408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static final int mainPoolSize = 418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Math.max(2, Runtime.getRuntime().availableProcessors()); 428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private static ForkJoinPool mainPool() { 448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return new ForkJoinPool(mainPoolSize); 458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private static ForkJoinPool singletonPool() { 488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return new ForkJoinPool(1); 498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private static ForkJoinPool asyncSingletonPool() { 528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return new ForkJoinPool(1, 538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle ForkJoinPool.defaultForkJoinWorkerThreadFactory, 548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle null, true); 558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private void testInvokeOnPool(ForkJoinPool pool, RecursiveAction a) { 58b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try (PoolCleaner cleaner = cleaner(pool)) { 598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isDone()); 608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCompletedNormally()); 618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCompletedAbnormally()); 628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCancelled()); 638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.getException()); 648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.getRawResult()); 658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(pool.invoke(a)); 678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.isDone()); 698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.isCompletedNormally()); 708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCompletedAbnormally()); 718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCancelled()); 728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.getException()); 738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.getRawResult()); 748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle void checkNotDone(ForkJoinTask a) { 788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isDone()); 798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCompletedNormally()); 808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCompletedAbnormally()); 818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCancelled()); 828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.getException()); 838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.getRawResult()); 848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.get(0L, SECONDS); 878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (TimeoutException success) { 898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (Throwable fail) { threadUnexpectedException(fail); } 908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle <T> void checkCompletedNormally(ForkJoinTask<T> a) { 938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(a, null); 948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle <T> void checkCompletedNormally(ForkJoinTask<T> a, T expected) { 978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.isDone()); 988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCancelled()); 998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.isCompletedNormally()); 1008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCompletedAbnormally()); 1018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.getException()); 1028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(expected, a.getRawResult()); 1038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle { 1058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 106b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long startTime = System.nanoTime(); 1078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(expected, a.join()); 108b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS); 1098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.interrupted(); 1108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle { 1138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 114b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long startTime = System.nanoTime(); 1158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.quietlyJoin(); // should be no-op 116b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS); 1178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.interrupted(); 1188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.cancel(false)); 1218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.cancel(true)); 1228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(expected, a.get()); 1248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (Throwable fail) { threadUnexpectedException(fail); } 1258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(expected, a.get(5L, SECONDS)); 1278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (Throwable fail) { threadUnexpectedException(fail); } 1288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle void checkCancelled(ForkJoinTask a) { 1318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.isDone()); 1328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.isCancelled()); 1338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCompletedNormally()); 1348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.isCompletedAbnormally()); 1358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.getException() instanceof CancellationException); 1368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.getRawResult()); 1378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.cancel(false)); 1388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.cancel(true)); 1398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 1428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.join(); 1438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (CancellationException success) { 1458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (Throwable fail) { threadUnexpectedException(fail); } 1468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.interrupted(); 1478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle { 149b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long startTime = System.nanoTime(); 1508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.quietlyJoin(); // should be no-op 151b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS); 1528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.get(); 1568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (CancellationException success) { 1588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (Throwable fail) { threadUnexpectedException(fail); } 1598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.get(5L, SECONDS); 1628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (CancellationException success) { 1648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (Throwable fail) { threadUnexpectedException(fail); } 1658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle void checkCompletedAbnormally(ForkJoinTask a, Throwable t) { 1688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.isDone()); 1698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCancelled()); 1708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.isCompletedNormally()); 1718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(a.isCompletedAbnormally()); 1728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(t.getClass(), a.getException().getClass()); 1738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.getRawResult()); 1748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.cancel(false)); 1758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(a.cancel(true)); 1768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.currentThread().interrupt(); 1798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.join(); 1808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (Throwable expected) { 1828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(t.getClass(), expected.getClass()); 1838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Thread.interrupted(); 1858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle { 187b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak long startTime = System.nanoTime(); 1888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.quietlyJoin(); // should be no-op 189b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertTrue(millisElapsedSince(startTime) < SMALL_DELAY_MS); 1908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 1918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.get(); 1948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 1958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (ExecutionException success) { 1968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(t.getClass(), success.getCause().getClass()); 1978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (Throwable fail) { threadUnexpectedException(fail); } 1988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 1998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.get(5L, SECONDS); 2018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 2028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (ExecutionException success) { 2038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(t.getClass(), success.getCause().getClass()); 2048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (Throwable fail) { threadUnexpectedException(fail); } 2058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /* 2088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * Testing coverage notes: 2098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * 2108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * To test extension methods and overrides, most tests use 2118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * BinaryAsyncAction extension class that processes joins 2128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * differently than supplied Recursive forms. 2138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 2148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public static final class FJException extends RuntimeException { 2168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FJException() { super(); } 2178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle abstract static class BinaryAsyncAction extends ForkJoinTask<Void> { 2208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private volatile int controlState; 2218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static final AtomicIntegerFieldUpdater<BinaryAsyncAction> controlStateUpdater = 2238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AtomicIntegerFieldUpdater.newUpdater(BinaryAsyncAction.class, 2248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle "controlState"); 2258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 226b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private volatile BinaryAsyncAction parent; 2278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 228b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak private volatile BinaryAsyncAction sibling; 2298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected BinaryAsyncAction() { 2318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public final Void getRawResult() { return null; } 2348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected final void setRawResult(Void mustBeNull) { } 2358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public final void linkSubtasks(BinaryAsyncAction x, BinaryAsyncAction y) { 2378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle x.parent = y.parent = this; 2388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle x.sibling = y; 2398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle y.sibling = x; 2408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void onComplete(BinaryAsyncAction x, BinaryAsyncAction y) { 2438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected boolean onException() { 2468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return true; 2478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void linkAndForkSubtasks(BinaryAsyncAction x, BinaryAsyncAction y) { 2508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle linkSubtasks(x, y); 2518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle y.fork(); 2528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle x.fork(); 2538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private void completeThis() { 2568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle super.complete(null); 2578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle private void completeThisExceptionally(Throwable ex) { 2608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle super.completeExceptionally(ex); 2618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 263b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public boolean cancel(boolean mayInterruptIfRunning) { 264b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (super.cancel(mayInterruptIfRunning)) { 265b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak completeExceptionally(new FJException()); 266b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak return true; 267b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 268b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak return false; 269b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 270b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak 2718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public final void complete() { 2728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle BinaryAsyncAction a = this; 2738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle for (;;) { 2748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle BinaryAsyncAction s = a.sibling; 2758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle BinaryAsyncAction p = a.parent; 2768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.sibling = null; 2778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.parent = null; 2788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.completeThis(); 2798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle if (p == null || p.compareAndSetControlState(0, 1)) 2808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle break; 2818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 2828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.onComplete(a, s); 2838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (Throwable rex) { 2848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle p.completeExceptionally(rex); 2858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return; 2868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a = p; 2888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 2908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 2918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public final void completeExceptionally(Throwable ex) { 292b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak for (BinaryAsyncAction a = this;;) { 2938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle a.completeThisExceptionally(ex); 2948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle BinaryAsyncAction s = a.sibling; 295b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if (s != null && !s.isDone()) 296b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak s.completeExceptionally(ex); 297b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak if ((a = a.parent) == null) 2988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle break; 2998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public final BinaryAsyncAction getParent() { 3038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return parent; 3048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public BinaryAsyncAction getSibling() { 3078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return sibling; 3088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void reinitialize() { 3118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle parent = sibling = null; 3128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle super.reinitialize(); 3138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected final int getControlState() { 3168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return controlState; 3178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected final boolean compareAndSetControlState(int expect, 3208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int update) { 3218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return controlStateUpdater.compareAndSet(this, expect, update); 3228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected final void setControlState(int value) { 3258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle controlState = value; 3268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected final void incrementControlState() { 3298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle controlStateUpdater.incrementAndGet(this); 3308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected final void decrementControlState() { 3338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle controlStateUpdater.decrementAndGet(this); 3348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static final class AsyncFib extends BinaryAsyncAction { 3398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int number; 3408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public AsyncFib(int n) { 3418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle this.number = n; 3428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public final boolean exec() { 3458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = this; 3468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int n = f.number; 347b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak while (n > 1) { 348b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak AsyncFib p = f; 349b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak AsyncFib r = new AsyncFib(n - 2); 350b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak f = new AsyncFib(--n); 351b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.linkSubtasks(r, f); 352b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak r.fork(); 3538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.complete(); 3558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return false; 3568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void onComplete(BinaryAsyncAction x, BinaryAsyncAction y) { 3598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle number = ((AsyncFib)x).number + ((AsyncFib)y).number; 3608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle static final class FailingAsyncFib extends BinaryAsyncAction { 3648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int number; 3658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public FailingAsyncFib(int n) { 3668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle this.number = n; 3678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public final boolean exec() { 3708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = this; 3718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle int n = f.number; 372b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak while (n > 1) { 373b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak FailingAsyncFib p = f; 374b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak FailingAsyncFib r = new FailingAsyncFib(n - 2); 375b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak f = new FailingAsyncFib(--n); 376b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak p.linkSubtasks(r, f); 377b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak r.fork(); 3788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.complete(); 3808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle return false; 3818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void onComplete(BinaryAsyncAction x, BinaryAsyncAction y) { 3848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle completeExceptionally(new FJException()); 3858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 3878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 3888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 3898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invoke returns when task completes normally. 3908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * isCompletedAbnormally and isCancelled return false for normally 3918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * completed tasks; getRawResult returns null. 3928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 3938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvoke() { 3948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 3958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 3968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 3978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(f.invoke()); 3988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 3998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 4008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 4018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 4028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * quietlyInvoke task returns when task completes normally. 4068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * isCompletedAbnormally and isCancelled return false for normally 4078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * completed tasks 4088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testQuietlyInvoke() { 4108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 4118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 4128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 4138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.quietlyInvoke(); 4148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 4158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 4168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 4178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 4188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * join of a forked task returns when task completes 4228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkJoin() { 4248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 4258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 4268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 4278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 4288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(f.join()); 4298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 4308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 4318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 4328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 4338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get of a forked task returns when task completes 4378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkGet() { 4398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 4408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 4418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 4428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 4438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(f.get()); 4448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 4458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 4468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 4478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 4488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed get of a forked task returns when task completes 4528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkTimedGet() { 4548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 4558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 4568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 4578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 4588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(f.get(LONG_DELAY_MS, MILLISECONDS)); 4598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 4608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 4618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 4628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 4638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed get with null time unit throws NPE 4678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkTimedGetNPE() { 4698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 4708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 4718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 4728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 4738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 4748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.get(5L, null); 4758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 4768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 4778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 4788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 4798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * quietlyJoin of a forked task returns when task completes 4838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 4848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkQuietlyJoin() { 4858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 4868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 4878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 4888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 4898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.quietlyJoin(); 4908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 4918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 4928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 4938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 4948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 4958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 4968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 4978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * helpQuiesce returns when tasks are complete. 4988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getQueuedTaskCount returns 0 when quiescent 4998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkHelpQuiesce() { 5018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 5028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 5038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 5048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 5058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle helpQuiesce(); 5068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 5078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, getQueuedTaskCount()); 5088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 5098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 5108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 5118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invoke task throws exception when task completes abnormally 5158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalInvoke() { 5178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 5188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 5198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 5208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.invoke(); 5228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 5248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, success); 5258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 5278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 5288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * quietlyInvoke task returns when task completes abnormally 5328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalQuietlyInvoke() { 5348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 5358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 5368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 5378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.quietlyInvoke(); 5388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.getException() instanceof FJException); 5398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, f.getException()); 5408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 5418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 5428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * join of a forked task throws exception when task completes abnormally 5468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalForkJoin() { 5488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 5498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 5508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 5518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 5528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.join(); 5548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 5568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, success); 5578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 5598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 5608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get of a forked task throws exception when task completes abnormally 5648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalForkGet() { 5668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 5678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 5688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 5698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 5708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.get(); 5728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (ExecutionException success) { 5748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Throwable cause = success.getCause(); 5758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(cause instanceof FJException); 5768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, cause); 5778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 5798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 5808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 5828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 5838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed get of a forked task throws exception when task completes abnormally 5848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 5858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalForkTimedGet() { 5868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 5878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 5888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 5898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 5908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 5918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.get(LONG_DELAY_MS, MILLISECONDS); 5928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 5938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (ExecutionException success) { 5948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Throwable cause = success.getCause(); 5958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(cause instanceof FJException); 5968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, cause); 5978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 5988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 5998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 6008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * quietlyJoin of a forked task returns when task completes abnormally 6048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalForkQuietlyJoin() { 6068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 6078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 6088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 6098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 6108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.quietlyJoin(); 6118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.getException() instanceof FJException); 6128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, f.getException()); 6138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 6148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 6158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invoke task throws exception when task cancelled 6198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCancelledInvoke() { 6218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 6228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 6238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 6248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.cancel(true)); 6258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 6268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.invoke(); 6278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 6288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (CancellationException success) { 6298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCancelled(f); 6308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 6328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 6338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * join of a forked task throws exception when task cancelled 6378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCancelledForkJoin() { 6398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 6408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 6418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 6428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.cancel(true)); 6438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 6448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 6458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.join(); 6468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 6478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (CancellationException success) { 6488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCancelled(f); 6498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 6518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 6528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get of a forked task throws exception when task cancelled 6568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCancelledForkGet() { 6588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 6598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 6608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 6618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.cancel(true)); 6628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 6638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 6648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.get(); 6658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 6668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (CancellationException success) { 6678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCancelled(f); 6688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 6708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 6718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed get of a forked task throws exception when task cancelled 6758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCancelledForkTimedGet() throws Exception { 6778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 6788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 6798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 6808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.cancel(true)); 6818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 6828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 6838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.get(LONG_DELAY_MS, MILLISECONDS); 6848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 6858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (CancellationException success) { 6868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCancelled(f); 6878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 6898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 6908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 6918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 6928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 6938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * quietlyJoin of a forked task returns when task cancelled 6948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 6958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCancelledForkQuietlyJoin() { 6968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 6978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 6988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 6998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.cancel(true)); 7008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 7018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.quietlyJoin(); 7028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCancelled(f); 7038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 7048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 7058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getPool of executing task returns its pool 7098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetPool() { 7118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle final ForkJoinPool mainPool = mainPool(); 7128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 7138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 7148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(mainPool, getPool()); 7158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 7168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool, a); 7178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getPool of non-FJ task returns null 7218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetPool2() { 7238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 7248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 7258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(getPool()); 7268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 7278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.invoke()); 7288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * inForkJoinPool of executing task returns true 7328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInForkJoinPool() { 7348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 7358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 7368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(inForkJoinPool()); 7378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 7388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 7398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * inForkJoinPool of non-FJ task returns false 7438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInForkJoinPool2() { 7458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 7468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 7478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertFalse(inForkJoinPool()); 7488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 7498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.invoke()); 7508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * setRawResult(null) succeeds 7548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testSetRawResult() { 7568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 7578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 7588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle setRawResult(null); 7598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(getRawResult()); 7608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 7618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(a.invoke()); 7628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 7658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invoke task throws exception after invoking completeExceptionally 7668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 7678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCompleteExceptionally() { 7688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 7698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 7708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 7718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.completeExceptionally(new FJException()); 7728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 7738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.invoke(); 7748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 7758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 7768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, success); 7778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 7798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 7808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 7818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 7828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 783b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * completeExceptionally(null) surprisingly has the same effect as 784b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak * completeExceptionally(new RuntimeException()) 785b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak */ 786b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak public void testCompleteExceptionally_null() { 787b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak RecursiveAction a = new CheckedRecursiveAction() { 788b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak protected void realCompute() { 789b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak AsyncFib f = new AsyncFib(8); 790b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak f.completeExceptionally(null); 791b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak try { 792b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak f.invoke(); 793b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak shouldThrow(); 794b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } catch (RuntimeException success) { 795b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertSame(success.getClass(), RuntimeException.class); 796b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak assertNull(success.getCause()); 797b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak checkCompletedAbnormally(f, success); 798b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 799b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak }}; 800b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak testInvokeOnPool(mainPool(), a); 801b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak } 802b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak 803b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak /** 8048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(t1, t2) invokes all task arguments 8058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll2() { 8078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 8088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 8098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 8108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 8118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(f, g); 8128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 8138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(34, g.number); 8148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 8158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 8168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 8178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 8188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(tasks) with 1 argument invokes task 8228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll1() { 8248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 8258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 8268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 8278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(f); 8288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 8298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 8308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 8318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 8328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(tasks) with > 2 argument invokes tasks 8368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll3() { 8388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 8398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 8408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 8418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 8428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib h = new AsyncFib(7); 8438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(f, g, h); 8448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 8458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(34, g.number); 8468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(13, h.number); 8478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 8488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 8498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(h); 8508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 8518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 8528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(collection) invokes all tasks in the collection 8568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAllCollection() { 8588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 8598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 8608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 8618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 8628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib h = new AsyncFib(7); 8638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle HashSet set = new HashSet(); 8648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle set.add(f); 8658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle set.add(g); 8668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle set.add(h); 8678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(set); 8688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 8698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(34, g.number); 8708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(13, h.number); 8718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 8728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 8738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(h); 8748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 8758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 8768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(tasks) with any null task throws NPE 8808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAllNPE() { 8828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 8838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 8848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 8858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 8868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib h = null; 8878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 8888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(f, g, h); 8898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 8908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 8918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 8928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 8938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 8948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 8958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 8968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(t1, t2) throw exception if any task does 8978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 8988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalInvokeAll2() { 8998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 9008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 9018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 9028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib g = new FailingAsyncFib(9); 903b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ForkJoinTask[] tasks = { f, g }; 904b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Collections.shuffle(Arrays.asList(tasks)); 9058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 906b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak invokeAll(tasks); 9078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 9088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 9098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(g, success); 9108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 9128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 9138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(tasks) with 1 argument throws exception if task does 9178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalInvokeAll1() { 9198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 9208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 9218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib g = new FailingAsyncFib(9); 9228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 9238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(g); 9248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 9258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 9268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(g, success); 9278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 9298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 9308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(tasks) with > 2 argument throws exception if any task does 9348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalInvokeAll3() { 9368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 9378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 9388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 9398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib g = new FailingAsyncFib(9); 9408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib h = new AsyncFib(7); 941b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ForkJoinTask[] tasks = { f, g, h }; 942b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Collections.shuffle(Arrays.asList(tasks)); 9438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 944b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak invokeAll(tasks); 9458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 9468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 9478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(g, success); 9488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 9508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 9518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9548e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * invokeAll(collection) throws exception if any task does 9558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalInvokeAllCollection() { 9578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 9588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 9598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 9608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 9618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib h = new AsyncFib(7); 962b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ForkJoinTask[] tasks = { f, g, h }; 963b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List taskList = Arrays.asList(tasks); 964b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Collections.shuffle(taskList); 9658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 966b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak invokeAll(taskList); 9678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 9688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 9698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, success); 9708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 9728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(mainPool(), a); 9738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * tryUnfork returns true for most recent unexecuted task, 9778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * and suppresses execution 9788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testTryUnfork() { 9808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 9818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 9828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 9838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(g, g.fork()); 9848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 9858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 9868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.tryUnfork()); 9878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle helpQuiesce(); 9888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkNotDone(f); 9898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 9908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 9918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 9928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 9938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 9948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 9958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getSurplusQueuedTaskCount returns > 0 when 9968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * there are more tasks than threads 9978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 9988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testGetSurplusQueuedTaskCount() { 9998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 10008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 10018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib h = new AsyncFib(7); 10028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(h, h.fork()); 10038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 10048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(g, g.fork()); 10058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 10068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 10078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(getSurplusQueuedTaskCount() > 0); 10088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle helpQuiesce(); 10098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, getSurplusQueuedTaskCount()); 10108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 10118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 10128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(h); 10138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 10148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 10158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * peekNextLocalTask returns most recent unexecuted task. 10198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPeekNextLocalTask() { 10218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 10228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 10238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 10248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(g, g.fork()); 10258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 10268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 10278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, peekNextLocalTask()); 10288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(f.join()); 10298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 10308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle helpQuiesce(); 10318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 10328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 10338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 10348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * pollNextLocalTask returns most recent unexecuted task without 10388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * executing it 10398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPollNextLocalTask() { 10418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 10428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 10438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 10448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(g, g.fork()); 10458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 10468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 10478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, pollNextLocalTask()); 10488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle helpQuiesce(); 10498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkNotDone(f); 10508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(34, g.number); 10518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 10528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 10538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 10548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * pollTask returns an unexecuted task without executing it 10588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPollTask() { 10608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 10618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 10628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 10638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(g, g.fork()); 10648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 10658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 10668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, pollTask()); 10678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle helpQuiesce(); 10688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkNotDone(f); 10698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 10708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 10718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 10728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * peekNextLocalTask returns least recent unexecuted task in async mode 10768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPeekNextLocalTaskAsync() { 10788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 10798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 10808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 10818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(g, g.fork()); 10828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 10838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 10848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(g, peekNextLocalTask()); 10858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(f.join()); 10868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle helpQuiesce(); 10878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 10888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(34, g.number); 10898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 10908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 10918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(asyncSingletonPool(), a); 10928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 10938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 10948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 10958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * pollNextLocalTask returns least recent unexecuted task without 10968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * executing it, in async mode 10978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 10988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPollNextLocalTaskAsync() { 10998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 11008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 11018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 11028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(g, g.fork()); 11038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 11048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 11058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(g, pollNextLocalTask()); 11068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle helpQuiesce(); 11078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 11088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 11098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkNotDone(g); 11108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 11118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(asyncSingletonPool(), a); 11128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * pollTask returns an unexecuted task without executing it, in 11168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * async mode 11178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testPollTaskAsync() { 11198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 11208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 11218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 11228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(g, g.fork()); 11238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 11248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 11258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(g, pollTask()); 11268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle helpQuiesce(); 11278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 11288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 11298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkNotDone(g); 11308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 11318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(asyncSingletonPool(), a); 11328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle // versions for singleton pools 11358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invoke returns when task completes normally. 11388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * isCompletedAbnormally and isCancelled return false for normally 11398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * completed tasks; getRawResult returns null. 11408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeSingleton() { 11428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 11438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 11448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 11458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(f.invoke()); 11468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 11478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 11488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 11498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 11508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * quietlyInvoke task returns when task completes normally. 11548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * isCompletedAbnormally and isCancelled return false for normally 11558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * completed tasks 11568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testQuietlyInvokeSingleton() { 11588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 11598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 11608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 11618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.quietlyInvoke(); 11628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 11638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 11648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 11658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 11668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * join of a forked task returns when task completes 11708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkJoinSingleton() { 11728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 11738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 11748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 11758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 11768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(f.join()); 11778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 11788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 11798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 11808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 11818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get of a forked task returns when task completes 11858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 11868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkGetSingleton() { 11878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 11888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 11898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 11908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 11918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(f.get()); 11928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 11938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 11948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 11958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 11968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 11978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 11988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 11998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed get of a forked task returns when task completes 12008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkTimedGetSingleton() { 12028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 12038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 12048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 12058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 12068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertNull(f.get(LONG_DELAY_MS, MILLISECONDS)); 12078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 12088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 12098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 12108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 12118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 12148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed get with null time unit throws NPE 12158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkTimedGetNPESingleton() { 12178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 12188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 12198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 12208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 12218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 12228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.get(5L, null); 12238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 12248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 12258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 12268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 12278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 12308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * quietlyJoin of a forked task returns when task completes 12318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkQuietlyJoinSingleton() { 12338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 12348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 12358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 12368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 12378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.quietlyJoin(); 12388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 12398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 12408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 12418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 12428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 12458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * helpQuiesce returns when tasks are complete. 12468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * getQueuedTaskCount returns 0 when quiescent 12478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testForkHelpQuiesceSingleton() { 12498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 12508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 12518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 12528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 12538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle helpQuiesce(); 12548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(0, getQueuedTaskCount()); 12558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 12568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 12578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 12588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 12598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 12628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invoke task throws exception when task completes abnormally 12638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalInvokeSingleton() { 12658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 12668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 12678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 12688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 12698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.invoke(); 12708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 12718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 12728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, success); 12738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 12758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 12768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 12798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * quietlyInvoke task returns when task completes abnormally 12808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalQuietlyInvokeSingleton() { 12828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 12838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 12848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 12858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.quietlyInvoke(); 12868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.getException() instanceof FJException); 12878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, f.getException()); 12888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 12898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 12908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 12918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 12928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 12938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * join of a forked task throws exception when task completes abnormally 12948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 12958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalForkJoinSingleton() { 12968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 12978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 12988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 12998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 13008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 13018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.join(); 13028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 13038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 13048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, success); 13058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 13078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 13088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 13118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get of a forked task throws exception when task completes abnormally 13128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 13138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalForkGetSingleton() { 13148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 13158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 13168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 13178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 13188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 13198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.get(); 13208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 13218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (ExecutionException success) { 13228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Throwable cause = success.getCause(); 13238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(cause instanceof FJException); 13248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, cause); 13258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 13278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 13288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 13318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed get of a forked task throws exception when task completes abnormally 13328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 13338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalForkTimedGetSingleton() { 13348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 13358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 13368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 13378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 13388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 13398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.get(LONG_DELAY_MS, MILLISECONDS); 13408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 13418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (ExecutionException success) { 13428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle Throwable cause = success.getCause(); 13438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(cause instanceof FJException); 13448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, cause); 13458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 13478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 13488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 13518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * quietlyJoin of a forked task returns when task completes abnormally 13528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 13538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalForkQuietlyJoinSingleton() { 13548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 13558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 13568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 13578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 13588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.quietlyJoin(); 13598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.getException() instanceof FJException); 13608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, f.getException()); 13618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 13628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 13638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 13668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invoke task throws exception when task cancelled 13678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 13688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCancelledInvokeSingleton() { 13698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 13708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 13718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 13728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.cancel(true)); 13738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 13748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.invoke(); 13758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 13768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (CancellationException success) { 13778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCancelled(f); 13788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 13808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 13818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 13838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 13848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * join of a forked task throws exception when task cancelled 13858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 13868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCancelledForkJoinSingleton() { 13878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 13888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 13898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 13908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.cancel(true)); 13918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 13928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 13938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.join(); 13948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 13958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (CancellationException success) { 13968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCancelled(f); 13978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 13988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 13998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 14008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * get of a forked task throws exception when task cancelled 14048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCancelledForkGetSingleton() { 14068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 14078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 14088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 14098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.cancel(true)); 14108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 14118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 14128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.get(); 14138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 14148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (CancellationException success) { 14158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCancelled(f); 14168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 14188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 14198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * timed get of a forked task throws exception when task cancelled 14238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCancelledForkTimedGetSingleton() throws Exception { 14258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 14268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() throws Exception { 14278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 14288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.cancel(true)); 14298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 14308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 14318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.get(LONG_DELAY_MS, MILLISECONDS); 14328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 14338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (CancellationException success) { 14348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCancelled(f); 14358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 14378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 14388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * quietlyJoin of a forked task returns when task cancelled 14428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCancelledForkQuietlyJoinSingleton() { 14448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 14458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 14468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 14478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertTrue(f.cancel(true)); 14488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertSame(f, f.fork()); 14498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.quietlyJoin(); 14508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCancelled(f); 14518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 14528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 14538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invoke task throws exception after invoking completeExceptionally 14578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testCompleteExceptionallySingleton() { 14598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 14608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 14618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 14628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.completeExceptionally(new FJException()); 14638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 14648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle f.invoke(); 14658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 14668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 14678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, success); 14688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 14708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 14718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14738f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14748f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(t1, t2) invokes all task arguments 14758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14768f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll2Singleton() { 14778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 14788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 14798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 14808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 14818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(f, g); 14828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 14838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(34, g.number); 14848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 14858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 14868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 14878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 14888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 14898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 14908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 14918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(tasks) with 1 argument invokes task 14928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 14938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll1Singleton() { 14948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 14958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 14968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 14978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(f); 14988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 14998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 15008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 15018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 15028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 15058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(tasks) with > 2 argument invokes tasks 15068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 15078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAll3Singleton() { 15088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 15098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 15108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 15118f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 15128f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib h = new AsyncFib(7); 15138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(f, g, h); 15148f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 15158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(34, g.number); 15168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(13, h.number); 15178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 15188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 15198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(h); 15208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 15218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 15228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15248f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 15258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(collection) invokes all tasks in the collection 15268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 15278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAllCollectionSingleton() { 15288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 15298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 15308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 15318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 15328f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib h = new AsyncFib(7); 15338f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle HashSet set = new HashSet(); 15348f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle set.add(f); 15358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle set.add(g); 15368f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle set.add(h); 15378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(set); 15388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(21, f.number); 15398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(34, g.number); 15408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle assertEquals(13, h.number); 15418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(f); 15428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(g); 15438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedNormally(h); 15448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 15458f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 15468f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15478f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15488f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 15498f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(tasks) with any null task throws NPE 15508f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 15518f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testInvokeAllNPESingleton() { 15528f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 15538f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 15548f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 15558f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 15568f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib h = null; 15578f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 15588f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(f, g, h); 15598f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 15608f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (NullPointerException success) {} 15618f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 15628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 15638f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15648f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15658f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 15668f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(t1, t2) throw exception if any task does 15678f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 15688f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalInvokeAll2Singleton() { 15698f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 15708f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 15718f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 15728f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib g = new FailingAsyncFib(9); 1573b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ForkJoinTask[] tasks = { f, g }; 1574b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Collections.shuffle(Arrays.asList(tasks)); 15758f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1576b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak invokeAll(tasks); 15778f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 15788f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 15798f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(g, success); 15808f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15818f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 15828f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 15838f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15848f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 15858f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 15868f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(tasks) with 1 argument throws exception if task does 15878f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 15888f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalInvokeAll1Singleton() { 15898f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 15908f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 15918f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib g = new FailingAsyncFib(9); 15928f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 15938f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle invokeAll(g); 15948f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 15958f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 15968f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(g, success); 15978f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 15988f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 15998f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 16008f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16018f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 16028f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 16038f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle * invokeAll(tasks) with > 2 argument throws exception if any task does 16048f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 16058f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalInvokeAll3Singleton() { 16068f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 16078f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 16088f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib f = new AsyncFib(8); 16098f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib g = new FailingAsyncFib(9); 16108f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib h = new AsyncFib(7); 1611b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ForkJoinTask[] tasks = { f, g, h }; 1612b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Collections.shuffle(Arrays.asList(tasks)); 16138f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1614b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak invokeAll(tasks); 16158f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 16168f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 16178f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(g, success); 16188f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16198f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 16208f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 16218f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16228f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 16238f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle /** 16248e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * invokeAll(collection) throws exception if any task does 16258f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle */ 16268f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle public void testAbnormalInvokeAllCollectionSingleton() { 16278f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle RecursiveAction a = new CheckedRecursiveAction() { 16288f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle protected void realCompute() { 16298f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle FailingAsyncFib f = new FailingAsyncFib(8); 16308f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib g = new AsyncFib(9); 16318f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle AsyncFib h = new AsyncFib(7); 1632b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak ForkJoinTask[] tasks = { f, g, h }; 1633b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak List taskList = Arrays.asList(tasks); 1634b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak Collections.shuffle(taskList); 16358f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle try { 1636b8b75116273ecfdb8ffdd1869b1c0dd04570a95ePrzemyslaw Szczepaniak invokeAll(taskList); 16378f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle shouldThrow(); 16388f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } catch (FJException success) { 16398f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle checkCompletedAbnormally(f, success); 16408f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16418f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle }}; 16428f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle testInvokeOnPool(singletonPool(), a); 16438f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle } 16448f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle 16458e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath /** 16468e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * ForkJoinTask.quietlyComplete returns when task completes 16478e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * normally without setting a value. The most recent value 16488e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * established by setRawResult(V) (or null by default) is returned 16498e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath * from invoke. 16508e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath */ 16518e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath public void testQuietlyComplete() { 16528e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath RecursiveAction a = new CheckedRecursiveAction() { 16538e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath protected void realCompute() { 16548e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath AsyncFib f = new AsyncFib(8); 16558e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath f.quietlyComplete(); 16568e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath assertEquals(8, f.number); 16578e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath checkCompletedNormally(f); 16588e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath }}; 16598e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath testInvokeOnPool(mainPool(), a); 16608e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath } 16618e9a0e92906742b17eb08d7fb83cca91965f9b8eNarayan Kamath 16628f0d92bba199d906c70a5e40d7f3516c1a424117Calin Juravle} 1663