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