1 /*
2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
3  *
4  * This code is free software; you can redistribute it and/or modify it
5  * under the terms of the GNU General Public License version 2 only, as
6  * published by the Free Software Foundation.  Oracle designates this
7  * particular file as subject to the "Classpath" exception as provided
8  * by Oracle in the LICENSE file that accompanied this code.
9  *
10  * This code is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13  * version 2 for more details (a copy is included in the LICENSE file that
14  * accompanied this code).
15  *
16  * You should have received a copy of the GNU General Public License version
17  * 2 along with this work; if not, write to the Free Software Foundation,
18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19  *
20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21  * or visit www.oracle.com if you need additional information or have any
22  * questions.
23  */
24 
25 /*
26  * This file is available under and governed by the GNU General Public
27  * License version 2 only, as published by the Free Software Foundation.
28  * However, the following notice accompanied the original version of this
29  * file:
30  *
31  * Written by Doug Lea with assistance from members of JCP JSR-166
32  * Expert Group and released to the public domain, as explained at
33  * http://creativecommons.org/publicdomain/zero/1.0/
34  */
35 
36 package java.util.concurrent;
37 
38 import java.lang.invoke.MethodHandles;
39 import java.lang.invoke.VarHandle;
40 
41 /**
42  * A {@link ForkJoinTask} with a completion action performed when
43  * triggered and there are no remaining pending actions.
44  * CountedCompleters are in general more robust in the
45  * presence of subtask stalls and blockage than are other forms of
46  * ForkJoinTasks, but are less intuitive to program.  Uses of
47  * CountedCompleter are similar to those of other completion based
48  * components (such as {@link java.nio.channels.CompletionHandler})
49  * except that multiple <em>pending</em> completions may be necessary
50  * to trigger the completion action {@link #onCompletion(CountedCompleter)},
51  * not just one.
52  * Unless initialized otherwise, the {@linkplain #getPendingCount pending
53  * count} starts at zero, but may be (atomically) changed using
54  * methods {@link #setPendingCount}, {@link #addToPendingCount}, and
55  * {@link #compareAndSetPendingCount}. Upon invocation of {@link
56  * #tryComplete}, if the pending action count is nonzero, it is
57  * decremented; otherwise, the completion action is performed, and if
58  * this completer itself has a completer, the process is continued
59  * with its completer.  As is the case with related synchronization
60  * components such as {@link Phaser} and {@link Semaphore}, these methods
61  * affect only internal counts; they do not establish any further
62  * internal bookkeeping. In particular, the identities of pending
63  * tasks are not maintained. As illustrated below, you can create
64  * subclasses that do record some or all pending tasks or their
65  * results when needed.  As illustrated below, utility methods
66  * supporting customization of completion traversals are also
67  * provided. However, because CountedCompleters provide only basic
68  * synchronization mechanisms, it may be useful to create further
69  * abstract subclasses that maintain linkages, fields, and additional
70  * support methods appropriate for a set of related usages.
71  *
72  * <p>A concrete CountedCompleter class must define method {@link
73  * #compute}, that should in most cases (as illustrated below), invoke
74  * {@code tryComplete()} once before returning. The class may also
75  * optionally override method {@link #onCompletion(CountedCompleter)}
76  * to perform an action upon normal completion, and method
77  * {@link #onExceptionalCompletion(Throwable, CountedCompleter)} to
78  * perform an action upon any exception.
79  *
80  * <p>CountedCompleters most often do not bear results, in which case
81  * they are normally declared as {@code CountedCompleter<Void>}, and
82  * will always return {@code null} as a result value.  In other cases,
83  * you should override method {@link #getRawResult} to provide a
84  * result from {@code join(), invoke()}, and related methods.  In
85  * general, this method should return the value of a field (or a
86  * function of one or more fields) of the CountedCompleter object that
87  * holds the result upon completion. Method {@link #setRawResult} by
88  * default plays no role in CountedCompleters.  It is possible, but
89  * rarely applicable, to override this method to maintain other
90  * objects or fields holding result data.
91  *
92  * <p>A CountedCompleter that does not itself have a completer (i.e.,
93  * one for which {@link #getCompleter} returns {@code null}) can be
94  * used as a regular ForkJoinTask with this added functionality.
95  * However, any completer that in turn has another completer serves
96  * only as an internal helper for other computations, so its own task
97  * status (as reported in methods such as {@link ForkJoinTask#isDone})
98  * is arbitrary; this status changes only upon explicit invocations of
99  * {@link #complete}, {@link ForkJoinTask#cancel},
100  * {@link ForkJoinTask#completeExceptionally(Throwable)} or upon
101  * exceptional completion of method {@code compute}. Upon any
102  * exceptional completion, the exception may be relayed to a task's
103  * completer (and its completer, and so on), if one exists and it has
104  * not otherwise already completed. Similarly, cancelling an internal
105  * CountedCompleter has only a local effect on that completer, so is
106  * not often useful.
107  *
108  * <p><b>Sample Usages.</b>
109  *
110  * <p><b>Parallel recursive decomposition.</b> CountedCompleters may
111  * be arranged in trees similar to those often used with {@link
112  * RecursiveAction}s, although the constructions involved in setting
113  * them up typically vary. Here, the completer of each task is its
114  * parent in the computation tree. Even though they entail a bit more
115  * bookkeeping, CountedCompleters may be better choices when applying
116  * a possibly time-consuming operation (that cannot be further
117  * subdivided) to each element of an array or collection; especially
118  * when the operation takes a significantly different amount of time
119  * to complete for some elements than others, either because of
120  * intrinsic variation (for example I/O) or auxiliary effects such as
121  * garbage collection.  Because CountedCompleters provide their own
122  * continuations, other tasks need not block waiting to perform them.
123  *
124  * <p>For example, here is an initial version of a utility method that
125  * uses divide-by-two recursive decomposition to divide work into
126  * single pieces (leaf tasks). Even when work is split into individual
127  * calls, tree-based techniques are usually preferable to directly
128  * forking leaf tasks, because they reduce inter-thread communication
129  * and improve load balancing. In the recursive case, the second of
130  * each pair of subtasks to finish triggers completion of their parent
131  * (because no result combination is performed, the default no-op
132  * implementation of method {@code onCompletion} is not overridden).
133  * The utility method sets up the root task and invokes it (here,
134  * implicitly using the {@link ForkJoinPool#commonPool()}).  It is
135  * straightforward and reliable (but not optimal) to always set the
136  * pending count to the number of child tasks and call {@code
137  * tryComplete()} immediately before returning.
138  *
139  * <pre> {@code
140  * public static <E> void forEach(E[] array, Consumer<E> action) {
141  *   class Task extends CountedCompleter<Void> {
142  *     final int lo, hi;
143  *     Task(Task parent, int lo, int hi) {
144  *       super(parent); this.lo = lo; this.hi = hi;
145  *     }
146  *
147  *     public void compute() {
148  *       if (hi - lo >= 2) {
149  *         int mid = (lo + hi) >>> 1;
150  *         // must set pending count before fork
151  *         setPendingCount(2);
152  *         new Task(this, mid, hi).fork(); // right child
153  *         new Task(this, lo, mid).fork(); // left child
154  *       }
155  *       else if (hi > lo)
156  *         action.accept(array[lo]);
157  *       tryComplete();
158  *     }
159  *   }
160  *   new Task(null, 0, array.length).invoke();
161  * }}</pre>
162  *
163  * This design can be improved by noticing that in the recursive case,
164  * the task has nothing to do after forking its right task, so can
165  * directly invoke its left task before returning. (This is an analog
166  * of tail recursion removal.)  Also, when the last action in a task
167  * is to fork or invoke a subtask (a "tail call"), the call to {@code
168  * tryComplete()} can be optimized away, at the cost of making the
169  * pending count look "off by one".
170  *
171  * <pre> {@code
172  *     public void compute() {
173  *       if (hi - lo >= 2) {
174  *         int mid = (lo + hi) >>> 1;
175  *         setPendingCount(1); // looks off by one, but correct!
176  *         new Task(this, mid, hi).fork(); // right child
177  *         new Task(this, lo, mid).compute(); // direct invoke
178  *       } else {
179  *         if (hi > lo)
180  *           action.accept(array[lo]);
181  *         tryComplete();
182  *       }
183  *     }}</pre>
184  *
185  * As a further optimization, notice that the left task need not even exist.
186  * Instead of creating a new one, we can continue using the original task,
187  * and add a pending count for each fork.  Additionally, because no task
188  * in this tree implements an {@link #onCompletion(CountedCompleter)} method,
189  * {@code tryComplete} can be replaced with {@link #propagateCompletion}.
190  *
191  * <pre> {@code
192  *     public void compute() {
193  *       int n = hi - lo;
194  *       for (; n >= 2; n /= 2) {
195  *         addToPendingCount(1);
196  *         new Task(this, lo + n/2, lo + n).fork();
197  *       }
198  *       if (n > 0)
199  *         action.accept(array[lo]);
200  *       propagateCompletion();
201  *     }}</pre>
202  *
203  * When pending counts can be precomputed, they can be established in
204  * the constructor:
205  *
206  * <pre> {@code
207  * public static <E> void forEach(E[] array, Consumer<E> action) {
208  *   class Task extends CountedCompleter<Void> {
209  *     final int lo, hi;
210  *     Task(Task parent, int lo, int hi) {
211  *       super(parent, 31 - Integer.numberOfLeadingZeros(hi - lo));
212  *       this.lo = lo; this.hi = hi;
213  *     }
214  *
215  *     public void compute() {
216  *       for (int n = hi - lo; n >= 2; n /= 2)
217  *         new Task(this, lo + n/2, lo + n).fork();
218  *       action.accept(array[lo]);
219  *       propagateCompletion();
220  *     }
221  *   }
222  *   if (array.length > 0)
223  *     new Task(null, 0, array.length).invoke();
224  * }}</pre>
225  *
226  * Additional optimizations of such classes might entail specializing
227  * classes for leaf steps, subdividing by say, four, instead of two
228  * per iteration, and using an adaptive threshold instead of always
229  * subdividing down to single elements.
230  *
231  * <p><b>Searching.</b> A tree of CountedCompleters can search for a
232  * value or property in different parts of a data structure, and
233  * report a result in an {@link
234  * java.util.concurrent.atomic.AtomicReference AtomicReference} as
235  * soon as one is found. The others can poll the result to avoid
236  * unnecessary work. (You could additionally {@linkplain #cancel
237  * cancel} other tasks, but it is usually simpler and more efficient
238  * to just let them notice that the result is set and if so skip
239  * further processing.)  Illustrating again with an array using full
240  * partitioning (again, in practice, leaf tasks will almost always
241  * process more than one element):
242  *
243  * <pre> {@code
244  * class Searcher<E> extends CountedCompleter<E> {
245  *   final E[] array; final AtomicReference<E> result; final int lo, hi;
246  *   Searcher(CountedCompleter<?> p, E[] array, AtomicReference<E> result, int lo, int hi) {
247  *     super(p);
248  *     this.array = array; this.result = result; this.lo = lo; this.hi = hi;
249  *   }
250  *   public E getRawResult() { return result.get(); }
251  *   public void compute() { // similar to ForEach version 3
252  *     int l = lo, h = hi;
253  *     while (result.get() == null && h >= l) {
254  *       if (h - l >= 2) {
255  *         int mid = (l + h) >>> 1;
256  *         addToPendingCount(1);
257  *         new Searcher(this, array, result, mid, h).fork();
258  *         h = mid;
259  *       }
260  *       else {
261  *         E x = array[l];
262  *         if (matches(x) && result.compareAndSet(null, x))
263  *           quietlyCompleteRoot(); // root task is now joinable
264  *         break;
265  *       }
266  *     }
267  *     tryComplete(); // normally complete whether or not found
268  *   }
269  *   boolean matches(E e) { ... } // return true if found
270  *
271  *   public static <E> E search(E[] array) {
272  *       return new Searcher<E>(null, array, new AtomicReference<E>(), 0, array.length).invoke();
273  *   }
274  * }}</pre>
275  *
276  * In this example, as well as others in which tasks have no other
277  * effects except to {@code compareAndSet} a common result, the
278  * trailing unconditional invocation of {@code tryComplete} could be
279  * made conditional ({@code if (result.get() == null) tryComplete();})
280  * because no further bookkeeping is required to manage completions
281  * once the root task completes.
282  *
283  * <p><b>Recording subtasks.</b> CountedCompleter tasks that combine
284  * results of multiple subtasks usually need to access these results
285  * in method {@link #onCompletion(CountedCompleter)}. As illustrated in the following
286  * class (that performs a simplified form of map-reduce where mappings
287  * and reductions are all of type {@code E}), one way to do this in
288  * divide and conquer designs is to have each subtask record its
289  * sibling, so that it can be accessed in method {@code onCompletion}.
290  * This technique applies to reductions in which the order of
291  * combining left and right results does not matter; ordered
292  * reductions require explicit left/right designations.  Variants of
293  * other streamlinings seen in the above examples may also apply.
294  *
295  * <pre> {@code
296  * class MyMapper<E> { E apply(E v) {  ...  } }
297  * class MyReducer<E> { E apply(E x, E y) {  ...  } }
298  * class MapReducer<E> extends CountedCompleter<E> {
299  *   final E[] array; final MyMapper<E> mapper;
300  *   final MyReducer<E> reducer; final int lo, hi;
301  *   MapReducer<E> sibling;
302  *   E result;
303  *   MapReducer(CountedCompleter<?> p, E[] array, MyMapper<E> mapper,
304  *              MyReducer<E> reducer, int lo, int hi) {
305  *     super(p);
306  *     this.array = array; this.mapper = mapper;
307  *     this.reducer = reducer; this.lo = lo; this.hi = hi;
308  *   }
309  *   public void compute() {
310  *     if (hi - lo >= 2) {
311  *       int mid = (lo + hi) >>> 1;
312  *       MapReducer<E> left = new MapReducer(this, array, mapper, reducer, lo, mid);
313  *       MapReducer<E> right = new MapReducer(this, array, mapper, reducer, mid, hi);
314  *       left.sibling = right;
315  *       right.sibling = left;
316  *       setPendingCount(1); // only right is pending
317  *       right.fork();
318  *       left.compute();     // directly execute left
319  *     }
320  *     else {
321  *       if (hi > lo)
322  *           result = mapper.apply(array[lo]);
323  *       tryComplete();
324  *     }
325  *   }
326  *   public void onCompletion(CountedCompleter<?> caller) {
327  *     if (caller != this) {
328  *       MapReducer<E> child = (MapReducer<E>)caller;
329  *       MapReducer<E> sib = child.sibling;
330  *       if (sib == null || sib.result == null)
331  *         result = child.result;
332  *       else
333  *         result = reducer.apply(child.result, sib.result);
334  *     }
335  *   }
336  *   public E getRawResult() { return result; }
337  *
338  *   public static <E> E mapReduce(E[] array, MyMapper<E> mapper, MyReducer<E> reducer) {
339  *     return new MapReducer<E>(null, array, mapper, reducer,
340  *                              0, array.length).invoke();
341  *   }
342  * }}</pre>
343  *
344  * Here, method {@code onCompletion} takes a form common to many
345  * completion designs that combine results. This callback-style method
346  * is triggered once per task, in either of the two different contexts
347  * in which the pending count is, or becomes, zero: (1) by a task
348  * itself, if its pending count is zero upon invocation of {@code
349  * tryComplete}, or (2) by any of its subtasks when they complete and
350  * decrement the pending count to zero. The {@code caller} argument
351  * distinguishes cases.  Most often, when the caller is {@code this},
352  * no action is necessary. Otherwise the caller argument can be used
353  * (usually via a cast) to supply a value (and/or links to other
354  * values) to be combined.  Assuming proper use of pending counts, the
355  * actions inside {@code onCompletion} occur (once) upon completion of
356  * a task and its subtasks. No additional synchronization is required
357  * within this method to ensure thread safety of accesses to fields of
358  * this task or other completed tasks.
359  *
360  * <p><b>Completion Traversals.</b> If using {@code onCompletion} to
361  * process completions is inapplicable or inconvenient, you can use
362  * methods {@link #firstComplete} and {@link #nextComplete} to create
363  * custom traversals.  For example, to define a MapReducer that only
364  * splits out right-hand tasks in the form of the third ForEach
365  * example, the completions must cooperatively reduce along
366  * unexhausted subtask links, which can be done as follows:
367  *
368  * <pre> {@code
369  * class MapReducer<E> extends CountedCompleter<E> { // version 2
370  *   final E[] array; final MyMapper<E> mapper;
371  *   final MyReducer<E> reducer; final int lo, hi;
372  *   MapReducer<E> forks, next; // record subtask forks in list
373  *   E result;
374  *   MapReducer(CountedCompleter<?> p, E[] array, MyMapper<E> mapper,
375  *              MyReducer<E> reducer, int lo, int hi, MapReducer<E> next) {
376  *     super(p);
377  *     this.array = array; this.mapper = mapper;
378  *     this.reducer = reducer; this.lo = lo; this.hi = hi;
379  *     this.next = next;
380  *   }
381  *   public void compute() {
382  *     int l = lo, h = hi;
383  *     while (h - l >= 2) {
384  *       int mid = (l + h) >>> 1;
385  *       addToPendingCount(1);
386  *       (forks = new MapReducer(this, array, mapper, reducer, mid, h, forks)).fork();
387  *       h = mid;
388  *     }
389  *     if (h > l)
390  *       result = mapper.apply(array[l]);
391  *     // process completions by reducing along and advancing subtask links
392  *     for (CountedCompleter<?> c = firstComplete(); c != null; c = c.nextComplete()) {
393  *       for (MapReducer t = (MapReducer)c, s = t.forks; s != null; s = t.forks = s.next)
394  *         t.result = reducer.apply(t.result, s.result);
395  *     }
396  *   }
397  *   public E getRawResult() { return result; }
398  *
399  *   public static <E> E mapReduce(E[] array, MyMapper<E> mapper, MyReducer<E> reducer) {
400  *     return new MapReducer<E>(null, array, mapper, reducer,
401  *                              0, array.length, null).invoke();
402  *   }
403  * }}</pre>
404  *
405  * <p><b>Triggers.</b> Some CountedCompleters are themselves never
406  * forked, but instead serve as bits of plumbing in other designs;
407  * including those in which the completion of one or more async tasks
408  * triggers another async task. For example:
409  *
410  * <pre> {@code
411  * class HeaderBuilder extends CountedCompleter<...> { ... }
412  * class BodyBuilder extends CountedCompleter<...> { ... }
413  * class PacketSender extends CountedCompleter<...> {
414  *   PacketSender(...) { super(null, 1); ... } // trigger on second completion
415  *   public void compute() { } // never called
416  *   public void onCompletion(CountedCompleter<?> caller) { sendPacket(); }
417  * }
418  * // sample use:
419  * PacketSender p = new PacketSender();
420  * new HeaderBuilder(p, ...).fork();
421  * new BodyBuilder(p, ...).fork();}</pre>
422  *
423  * @since 1.8
424  * @author Doug Lea
425  */
426 public abstract class CountedCompleter<T> extends ForkJoinTask<T> {
427     private static final long serialVersionUID = 5232453752276485070L;
428 
429     /** This task's completer, or null if none */
430     final CountedCompleter<?> completer;
431     /** The number of pending tasks until completion */
432     volatile int pending;
433 
434     /**
435      * Creates a new CountedCompleter with the given completer
436      * and initial pending count.
437      *
438      * @param completer this task's completer, or {@code null} if none
439      * @param initialPendingCount the initial pending count
440      */
CountedCompleter(CountedCompleter<?> completer, int initialPendingCount)441     protected CountedCompleter(CountedCompleter<?> completer,
442                                int initialPendingCount) {
443         this.completer = completer;
444         this.pending = initialPendingCount;
445     }
446 
447     /**
448      * Creates a new CountedCompleter with the given completer
449      * and an initial pending count of zero.
450      *
451      * @param completer this task's completer, or {@code null} if none
452      */
CountedCompleter(CountedCompleter<?> completer)453     protected CountedCompleter(CountedCompleter<?> completer) {
454         this.completer = completer;
455     }
456 
457     /**
458      * Creates a new CountedCompleter with no completer
459      * and an initial pending count of zero.
460      */
CountedCompleter()461     protected CountedCompleter() {
462         this.completer = null;
463     }
464 
465     /**
466      * The main computation performed by this task.
467      */
compute()468     public abstract void compute();
469 
470     /**
471      * Performs an action when method {@link #tryComplete} is invoked
472      * and the pending count is zero, or when the unconditional
473      * method {@link #complete} is invoked.  By default, this method
474      * does nothing. You can distinguish cases by checking the
475      * identity of the given caller argument. If not equal to {@code
476      * this}, then it is typically a subtask that may contain results
477      * (and/or links to other results) to combine.
478      *
479      * @param caller the task invoking this method (which may
480      * be this task itself)
481      */
onCompletion(CountedCompleter<?> caller)482     public void onCompletion(CountedCompleter<?> caller) {
483     }
484 
485     /**
486      * Performs an action when method {@link
487      * #completeExceptionally(Throwable)} is invoked or method {@link
488      * #compute} throws an exception, and this task has not already
489      * otherwise completed normally. On entry to this method, this task
490      * {@link ForkJoinTask#isCompletedAbnormally}.  The return value
491      * of this method controls further propagation: If {@code true}
492      * and this task has a completer that has not completed, then that
493      * completer is also completed exceptionally, with the same
494      * exception as this completer.  The default implementation of
495      * this method does nothing except return {@code true}.
496      *
497      * @param ex the exception
498      * @param caller the task invoking this method (which may
499      * be this task itself)
500      * @return {@code true} if this exception should be propagated to this
501      * task's completer, if one exists
502      */
onExceptionalCompletion(Throwable ex, CountedCompleter<?> caller)503     public boolean onExceptionalCompletion(Throwable ex, CountedCompleter<?> caller) {
504         return true;
505     }
506 
507     /**
508      * Returns the completer established in this task's constructor,
509      * or {@code null} if none.
510      *
511      * @return the completer
512      */
getCompleter()513     public final CountedCompleter<?> getCompleter() {
514         return completer;
515     }
516 
517     /**
518      * Returns the current pending count.
519      *
520      * @return the current pending count
521      */
getPendingCount()522     public final int getPendingCount() {
523         return pending;
524     }
525 
526     /**
527      * Sets the pending count to the given value.
528      *
529      * @param count the count
530      */
setPendingCount(int count)531     public final void setPendingCount(int count) {
532         pending = count;
533     }
534 
535     /**
536      * Adds (atomically) the given value to the pending count.
537      *
538      * @param delta the value to add
539      */
addToPendingCount(int delta)540     public final void addToPendingCount(int delta) {
541         PENDING.getAndAdd(this, delta);
542     }
543 
544     /**
545      * Sets (atomically) the pending count to the given count only if
546      * it currently holds the given expected value.
547      *
548      * @param expected the expected value
549      * @param count the new value
550      * @return {@code true} if successful
551      */
compareAndSetPendingCount(int expected, int count)552     public final boolean compareAndSetPendingCount(int expected, int count) {
553         return PENDING.compareAndSet(this, expected, count);
554     }
555 
556     // internal-only weak version
weakCompareAndSetPendingCount(int expected, int count)557     final boolean weakCompareAndSetPendingCount(int expected, int count) {
558         return PENDING.weakCompareAndSet(this, expected, count);
559     }
560 
561     /**
562      * If the pending count is nonzero, (atomically) decrements it.
563      *
564      * @return the initial (undecremented) pending count holding on entry
565      * to this method
566      */
decrementPendingCountUnlessZero()567     public final int decrementPendingCountUnlessZero() {
568         int c;
569         do {} while ((c = pending) != 0 &&
570                      !weakCompareAndSetPendingCount(c, c - 1));
571         return c;
572     }
573 
574     /**
575      * Returns the root of the current computation; i.e., this
576      * task if it has no completer, else its completer's root.
577      *
578      * @return the root of the current computation
579      */
getRoot()580     public final CountedCompleter<?> getRoot() {
581         CountedCompleter<?> a = this, p;
582         while ((p = a.completer) != null)
583             a = p;
584         return a;
585     }
586 
587     /**
588      * If the pending count is nonzero, decrements the count;
589      * otherwise invokes {@link #onCompletion(CountedCompleter)}
590      * and then similarly tries to complete this task's completer,
591      * if one exists, else marks this task as complete.
592      */
tryComplete()593     public final void tryComplete() {
594         CountedCompleter<?> a = this, s = a;
595         for (int c;;) {
596             if ((c = a.pending) == 0) {
597                 a.onCompletion(s);
598                 if ((a = (s = a).completer) == null) {
599                     s.quietlyComplete();
600                     return;
601                 }
602             }
603             else if (a.weakCompareAndSetPendingCount(c, c - 1))
604                 return;
605         }
606     }
607 
608     /**
609      * Equivalent to {@link #tryComplete} but does not invoke {@link
610      * #onCompletion(CountedCompleter)} along the completion path:
611      * If the pending count is nonzero, decrements the count;
612      * otherwise, similarly tries to complete this task's completer, if
613      * one exists, else marks this task as complete. This method may be
614      * useful in cases where {@code onCompletion} should not, or need
615      * not, be invoked for each completer in a computation.
616      */
propagateCompletion()617     public final void propagateCompletion() {
618         CountedCompleter<?> a = this, s;
619         for (int c;;) {
620             if ((c = a.pending) == 0) {
621                 if ((a = (s = a).completer) == null) {
622                     s.quietlyComplete();
623                     return;
624                 }
625             }
626             else if (a.weakCompareAndSetPendingCount(c, c - 1))
627                 return;
628         }
629     }
630 
631     /**
632      * Regardless of pending count, invokes
633      * {@link #onCompletion(CountedCompleter)}, marks this task as
634      * complete and further triggers {@link #tryComplete} on this
635      * task's completer, if one exists.  The given rawResult is
636      * used as an argument to {@link #setRawResult} before invoking
637      * {@link #onCompletion(CountedCompleter)} or marking this task
638      * as complete; its value is meaningful only for classes
639      * overriding {@code setRawResult}.  This method does not modify
640      * the pending count.
641      *
642      * <p>This method may be useful when forcing completion as soon as
643      * any one (versus all) of several subtask results are obtained.
644      * However, in the common (and recommended) case in which {@code
645      * setRawResult} is not overridden, this effect can be obtained
646      * more simply using {@link #quietlyCompleteRoot()}.
647      *
648      * @param rawResult the raw result
649      */
complete(T rawResult)650     public void complete(T rawResult) {
651         CountedCompleter<?> p;
652         setRawResult(rawResult);
653         onCompletion(this);
654         quietlyComplete();
655         if ((p = completer) != null)
656             p.tryComplete();
657     }
658 
659     /**
660      * If this task's pending count is zero, returns this task;
661      * otherwise decrements its pending count and returns {@code null}.
662      * This method is designed to be used with {@link #nextComplete} in
663      * completion traversal loops.
664      *
665      * @return this task, if pending count was zero, else {@code null}
666      */
firstComplete()667     public final CountedCompleter<?> firstComplete() {
668         for (int c;;) {
669             if ((c = pending) == 0)
670                 return this;
671             else if (weakCompareAndSetPendingCount(c, c - 1))
672                 return null;
673         }
674     }
675 
676     /**
677      * If this task does not have a completer, invokes {@link
678      * ForkJoinTask#quietlyComplete} and returns {@code null}.  Or, if
679      * the completer's pending count is non-zero, decrements that
680      * pending count and returns {@code null}.  Otherwise, returns the
681      * completer.  This method can be used as part of a completion
682      * traversal loop for homogeneous task hierarchies:
683      *
684      * <pre> {@code
685      * for (CountedCompleter<?> c = firstComplete();
686      *      c != null;
687      *      c = c.nextComplete()) {
688      *   // ... process c ...
689      * }}</pre>
690      *
691      * @return the completer, or {@code null} if none
692      */
nextComplete()693     public final CountedCompleter<?> nextComplete() {
694         CountedCompleter<?> p;
695         if ((p = completer) != null)
696             return p.firstComplete();
697         else {
698             quietlyComplete();
699             return null;
700         }
701     }
702 
703     /**
704      * Equivalent to {@code getRoot().quietlyComplete()}.
705      */
quietlyCompleteRoot()706     public final void quietlyCompleteRoot() {
707         for (CountedCompleter<?> a = this, p;;) {
708             if ((p = a.completer) == null) {
709                 a.quietlyComplete();
710                 return;
711             }
712             a = p;
713         }
714     }
715 
716     /**
717      * If this task has not completed, attempts to process at most the
718      * given number of other unprocessed tasks for which this task is
719      * on the completion path, if any are known to exist.
720      *
721      * @param maxTasks the maximum number of tasks to process.  If
722      *                 less than or equal to zero, then no tasks are
723      *                 processed.
724      */
helpComplete(int maxTasks)725     public final void helpComplete(int maxTasks) {
726         ForkJoinPool.WorkQueue q; Thread t; boolean owned;
727         if (owned = (t = Thread.currentThread()) instanceof ForkJoinWorkerThread)
728             q = ((ForkJoinWorkerThread)t).workQueue;
729         else
730             q = ForkJoinPool.commonQueue();
731         if (q != null && maxTasks > 0)
732             q.helpComplete(this, owned, maxTasks);
733     }
734 
735     // ForkJoinTask overrides
736 
737     /**
738      * Supports ForkJoinTask exception propagation.
739      */
740     @Override
trySetException(Throwable ex)741     final int trySetException(Throwable ex) {
742         CountedCompleter<?> a = this, p = a;
743         do {} while (isExceptionalStatus(a.trySetThrown(ex)) &&
744                      a.onExceptionalCompletion(ex, p) &&
745                      (a = (p = a).completer) != null && a.status >= 0);
746         return status;
747     }
748 
749     /**
750      * Implements execution conventions for CountedCompleters.
751      */
752     @Override
exec()753     protected final boolean exec() {
754         compute();
755         return false;
756     }
757 
758     /**
759      * Returns the result of the computation.  By default,
760      * returns {@code null}, which is appropriate for {@code Void}
761      * actions, but in other cases should be overridden, almost
762      * always to return a field or function of a field that
763      * holds the result upon completion.
764      *
765      * @return the result of the computation
766      */
767     @Override
getRawResult()768     public T getRawResult() { return null; }
769 
770     /**
771      * A method that result-bearing CountedCompleters may optionally
772      * use to help maintain result data.  By default, does nothing.
773      * Overrides are not recommended. However, if this method is
774      * overridden to update existing objects or fields, then it must
775      * in general be defined to be thread-safe.
776      */
777     @Override
setRawResult(T t)778     protected void setRawResult(T t) { }
779 
780     // VarHandle mechanics
781     private static final VarHandle PENDING;
782     static {
783         try {
784             MethodHandles.Lookup l = MethodHandles.lookup();
785             PENDING = l.findVarHandle(CountedCompleter.class, "pending", int.class);
786 
787         } catch (ReflectiveOperationException e) {
788             throw new ExceptionInInitializerError(e);
789         }
790     }
791 }
792