--- jsr166/src/test/loops/DynamicLeftSpineFib.java 2010/09/20 20:42:37 1.11 +++ jsr166/src/test/loops/DynamicLeftSpineFib.java 2015/09/12 19:09:00 1.18 @@ -1,7 +1,11 @@ -import java.util.concurrent.*; +/* + * Written by Doug Lea with assistance from members of JCP JSR-166 + * Expert Group and released to the public domain, as explained at + * http://creativecommons.org/publicdomain/zero/1.0/ + */ + import java.util.*; -import java.util.concurrent.TimeUnit; -//import java.util.concurrent.*; +import java.util.concurrent.*; public final class DynamicLeftSpineFib extends RecursiveAction { @@ -21,18 +25,19 @@ public final class DynamicLeftSpineFib e return; } - for (int reps = 0; reps < 2; ++reps) { - ForkJoinPool g = procs == 0? new ForkJoinPool() : + ForkJoinPool g = (procs == 0) ? ForkJoinPool.commonPool() : new ForkJoinPool(procs); lastStealCount = g.getStealCount(); for (int i = 0; i < 20; ++i) { test(g, num); } System.out.println(g); - g.shutdown(); - if (!g.awaitTermination(10, TimeUnit.SECONDS)) - throw new Error(); + if (g != ForkJoinPool.commonPool()) { + g.shutdown(); + if (!g.awaitTermination(10, TimeUnit.SECONDS)) + throw new Error(); + } Thread.sleep(1000); } } @@ -55,7 +60,6 @@ public final class DynamicLeftSpineFib e System.out.println(); } - // Initialized with argument; replaced with result int number; DynamicLeftSpineFib next; @@ -67,6 +71,7 @@ public final class DynamicLeftSpineFib e int getAnswer() { return number; } + public void compute() { number = fib(number); } @@ -78,21 +83,14 @@ public final class DynamicLeftSpineFib e DynamicLeftSpineFib rt = null; while (getSurplusQueuedTaskCount() <= 3) { int m = n - 2; - n -= 1; - if (m <= 1) { + if (m <= 1) r += m; - if (n > 1) { - r += n - 2; - n -= 1; - } + else + (rt = new DynamicLeftSpineFib(m, rt)).fork(); + if (--n <= 1) break; - } - (rt = new DynamicLeftSpineFib(m, rt)).fork(); } - if (n <= 1) - r += n; - else - r += seqFib(n - 2) + fib(n - 1); + r += n <= 1 ? n : seqFib(n); if (rt != null) r += collectRights(rt); return r; @@ -114,7 +112,7 @@ public final class DynamicLeftSpineFib e return r; } - // Sequential version for arguments less than threshold + /** Sequential version for arguments less than threshold */ static final int seqFib(int n) { // unroll left only int r = 1; do { @@ -125,4 +123,3 @@ public final class DynamicLeftSpineFib e } } -