--- jsr166/src/jsr166y/CountedCompleter.java 2012/10/21 05:28:08 1.5 +++ jsr166/src/jsr166y/CountedCompleter.java 2012/11/18 18:03:10 1.13 @@ -77,7 +77,7 @@ package jsr166y; * continuations, other threads need not block waiting to perform * them. * - *

For example, here is an initial version of a class that uses + *

For example, here is an initial version of a class that uses * divide-by-two recursive decomposition to divide work into single * pieces (leaf tasks). Even when work is split into individual calls, * tree-based techniques are usually preferable to directly forking @@ -142,7 +142,7 @@ 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. * *

 {@code
  * class ForEach ...
@@ -378,6 +378,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,
@@ -465,7 +478,6 @@ public abstract class CountedCompleter