--- jsr166/src/jsr166y/CountedCompleter.java 2012/10/21 05:28:08 1.5 +++ jsr166/src/jsr166y/CountedCompleter.java 2012/10/30 14:23:11 1.6 @@ -142,7 +142,9 @@ package jsr166y; * * As a further improvement, notice that the left task need not even * exist. Instead of creating a new one, we can iterate using the - * original task, and add a pending count for each fork: + * original task, and add a pending count for each fork. Additionally, + * this version uses {@code helpComplete} to streamline assistance in + * the execution of forked tasks. * *
 {@code
  * class ForEach ...
@@ -156,7 +158,7 @@ package jsr166y;
  *         }
  *         if (h > l)
  *             op.apply(array[l]);
- *         tryComplete();
+ *         helpComplete();
  *     }
  * }
* @@ -378,6 +380,19 @@ public abstract class CountedCompleter getRoot() { + CountedCompleter a = this, p; + while ((p = a.completer) != null) + a = p; + return a; + } + + /** * If the pending count is nonzero, decrements the count; * otherwise invokes {@link #onCompletion} and then similarly * tries to complete this task's completer, if one exists, @@ -399,6 +414,39 @@ public abstract class CountedCompleter a = this, s = a; + for (int c;;) { + if ((c = a.pending) == 0) { + a.onCompletion(s); + if ((a = (s = a).completer) == null) { + s.quietlyComplete(); + return; + } + } + else if (U.compareAndSwapInt(a, PENDING, c, c - 1)) { + CountedCompleter root = a.getRoot(); + Thread thread = Thread.currentThread(); + ForkJoinPool.WorkQueue wq = + (thread instanceof ForkJoinWorkerThread)? + ((ForkJoinWorkerThread)thread).workQueue : null; + ForkJoinTask t; + while ((t = (wq != null) ? wq.popCC(root) : + ForkJoinPool.popCCFromCommonPool(root)) != null) { + t.doExec(); + if (root.isDone()) + break; + } + return; + } + } + } + + /** * Regardless of pending count, invokes {@link #onCompletion}, * marks this task as complete and further triggers {@link * #tryComplete} on this task's completer, if one exists. This @@ -465,7 +513,6 @@ public abstract class CountedCompleter