ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/main/java/util/concurrent/CompletableFuture.java
Revision: 1.71
Committed: Tue Mar 19 14:21:40 2013 UTC (11 years, 2 months ago) by dl
Branch: MAIN
Changes since 1.70: +142 -104 lines
Log Message:
Wording improvements

File Contents

# User Rev Content
1 dl 1.1 /*
2     * Written by Doug Lea with assistance from members of JCP JSR-166
3     * Expert Group and released to the public domain, as explained at
4     * http://creativecommons.org/publicdomain/zero/1.0/
5     */
6    
7     package java.util.concurrent;
8     import java.util.function.Supplier;
9 dl 1.34 import java.util.function.Consumer;
10     import java.util.function.BiConsumer;
11 dl 1.1 import java.util.function.Function;
12     import java.util.function.BiFunction;
13     import java.util.concurrent.Future;
14     import java.util.concurrent.TimeUnit;
15     import java.util.concurrent.ForkJoinPool;
16     import java.util.concurrent.ForkJoinTask;
17     import java.util.concurrent.Executor;
18 dl 1.5 import java.util.concurrent.ThreadLocalRandom;
19 dl 1.1 import java.util.concurrent.ExecutionException;
20     import java.util.concurrent.TimeoutException;
21     import java.util.concurrent.CancellationException;
22     import java.util.concurrent.atomic.AtomicInteger;
23     import java.util.concurrent.locks.LockSupport;
24    
25     /**
26     * A {@link Future} that may be explicitly completed (setting its
27     * value and status), and may include dependent functions and actions
28 dl 1.35 * that trigger upon its completion.
29 dl 1.1 *
30 jsr166 1.50 * <p>When two or more threads attempt to
31     * {@link #complete complete},
32 jsr166 1.52 * {@link #completeExceptionally completeExceptionally}, or
33 jsr166 1.50 * {@link #cancel cancel}
34     * a CompletableFuture, only one of them succeeds.
35 dl 1.19 *
36 jsr166 1.65 * <p>Methods are available for adding dependents based on
37     * user-provided Functions, Consumers, or Runnables. The appropriate
38     * form to use depends on whether actions require arguments and/or
39     * produce results. Completion of a dependent action will trigger the
40     * completion of another CompletableFuture. Actions may also be
41     * triggered after either or both the current and another
42 dl 1.35 * CompletableFuture complete. Multiple CompletableFutures may also
43 jsr166 1.50 * be grouped as one using {@link #anyOf(CompletableFuture...)} and
44     * {@link #allOf(CompletableFuture...)}.
45 dl 1.35 *
46 jsr166 1.65 * <p>CompletableFutures themselves do not execute asynchronously.
47     * However, actions supplied for dependent completions of another
48     * CompletableFuture may do so, depending on whether they are provided
49     * via one of the <em>async</em> methods (that is, methods with names
50     * of the form <tt><var>xxx</var>Async</tt>). The <em>async</em>
51     * methods provide a way to commence asynchronous processing of an
52     * action using either a given {@link Executor} or by default the
53     * {@link ForkJoinPool#commonPool()}. To simplify monitoring,
54     * debugging, and tracking, all generated asynchronous tasks are
55     * instances of the marker interface {@link AsynchronousCompletionTask}.
56     *
57     * <p>Actions supplied for dependent completions of <em>non-async</em>
58     * methods may be performed by the thread that completes the current
59     * CompletableFuture, or by any other caller of these methods. There
60     * are no guarantees about the order of processing completions unless
61     * constrained by these methods.
62 dl 1.35 *
63 jsr166 1.55 * <p>Since (unlike {@link FutureTask}) this class has no direct
64     * control over the computation that causes it to be completed,
65     * cancellation is treated as just another form of exceptional completion.
66     * Method {@link #cancel cancel} has the same effect as
67     * {@code completeExceptionally(new CancellationException())}.
68     *
69 dl 1.48 * <p>Upon exceptional completion (including cancellation), or when a
70 jsr166 1.55 * completion entails an additional computation which terminates
71     * abruptly with an (unchecked) exception or error, then all of their
72     * dependent completions (and their dependents in turn) generally act
73     * as {@code completeExceptionally} with a {@link CompletionException}
74     * holding that exception as its cause. However, the {@link
75     * #exceptionally exceptionally} and {@link #handle handle}
76     * completions <em>are</em> able to handle exceptional completions of
77     * the CompletableFutures they depend on.
78     *
79     * <p>In case of exceptional completion with a CompletionException,
80     * methods {@link #get()} and {@link #get(long, TimeUnit)} throw an
81     * {@link ExecutionException} with the same cause as held in the
82     * corresponding CompletionException. However, in these cases,
83     * methods {@link #join()} and {@link #getNow} throw the
84     * CompletionException, which simplifies usage.
85 dl 1.1 *
86     * @author Doug Lea
87     * @since 1.8
88     */
89     public class CompletableFuture<T> implements Future<T> {
90 dl 1.28
91 dl 1.1 /*
92 dl 1.20 * Overview:
93 dl 1.1 *
94 jsr166 1.32 * 1. Non-nullness of field result (set via CAS) indicates done.
95     * An AltResult is used to box null as a result, as well as to
96     * hold exceptions. Using a single field makes completion fast
97 dl 1.20 * and simple to detect and trigger, at the expense of a lot of
98     * encoding and decoding that infiltrates many methods. One minor
99     * simplification relies on the (static) NIL (to box null results)
100     * being the only AltResult with a null exception field, so we
101 dl 1.28 * don't usually need explicit comparisons with NIL. The CF
102     * exception propagation mechanics surrounding decoding rely on
103     * unchecked casts of decoded results really being unchecked,
104     * where user type errors are caught at point of use, as is
105     * currently the case in Java. These are highlighted by using
106     * SuppressWarnings-annotated temporaries.
107 dl 1.1 *
108     * 2. Waiters are held in a Treiber stack similar to the one used
109 dl 1.20 * in FutureTask, Phaser, and SynchronousQueue. See their
110 dl 1.28 * internal documentation for algorithmic details.
111 dl 1.1 *
112     * 3. Completions are also kept in a list/stack, and pulled off
113 dl 1.28 * and run when completion is triggered. (We could even use the
114 jsr166 1.24 * same stack as for waiters, but would give up the potential
115 dl 1.20 * parallelism obtained because woken waiters help release/run
116 dl 1.28 * others -- see method postComplete). Because post-processing
117     * may race with direct calls, class Completion opportunistically
118     * extends AtomicInteger so callers can claim the action via
119     * compareAndSet(0, 1). The Completion.run methods are all
120     * written a boringly similar uniform way (that sometimes includes
121 jsr166 1.55 * unnecessary-looking checks, kept to maintain uniformity).
122     * There are enough dimensions upon which they differ that
123     * attempts to factor commonalities while maintaining efficiency
124     * require more lines of code than they would save.
125 dl 1.20 *
126     * 4. The exported then/and/or methods do support a bit of
127 dl 1.28 * factoring (see doThenApply etc). They must cope with the
128     * intrinsic races surrounding addition of a dependent action
129     * versus performing the action directly because the task is
130     * already complete. For example, a CF may not be complete upon
131     * entry, so a dependent completion is added, but by the time it
132     * is added, the target CF is complete, so must be directly
133 dl 1.20 * executed. This is all done while avoiding unnecessary object
134     * construction in safe-bypass cases.
135 dl 1.1 */
136    
137 dl 1.28 // preliminaries
138 dl 1.20
139 dl 1.1 static final class AltResult {
140     final Throwable ex; // null only for NIL
141 jsr166 1.2 AltResult(Throwable ex) { this.ex = ex; }
142 dl 1.1 }
143    
144     static final AltResult NIL = new AltResult(null);
145    
146 dl 1.20 // Fields
147    
148     volatile Object result; // Either the result or boxed AltResult
149 dl 1.1 volatile WaitNode waiters; // Treiber stack of threads blocked on get()
150     volatile CompletionNode completions; // list (Treiber stack) of completions
151    
152 dl 1.20 // Basic utilities for triggering and processing completions
153    
154     /**
155     * Removes and signals all waiting threads and runs all completions.
156     */
157     final void postComplete() {
158     WaitNode q; Thread t;
159     while ((q = waiters) != null) {
160     if (UNSAFE.compareAndSwapObject(this, WAITERS, q, q.next) &&
161     (t = q.thread) != null) {
162     q.thread = null;
163     LockSupport.unpark(t);
164     }
165     }
166    
167     CompletionNode h; Completion c;
168     while ((h = completions) != null) {
169     if (UNSAFE.compareAndSwapObject(this, COMPLETIONS, h, h.next) &&
170     (c = h.completion) != null)
171     c.run();
172     }
173     }
174    
175     /**
176     * Triggers completion with the encoding of the given arguments:
177     * if the exception is non-null, encodes it as a wrapped
178     * CompletionException unless it is one already. Otherwise uses
179     * the given result, boxed as NIL if null.
180     */
181     final void internalComplete(Object v, Throwable ex) {
182     if (result == null)
183     UNSAFE.compareAndSwapObject
184     (this, RESULT, null,
185     (ex == null) ? (v == null) ? NIL : v :
186     new AltResult((ex instanceof CompletionException) ? ex :
187     new CompletionException(ex)));
188     postComplete(); // help out even if not triggered
189     }
190    
191     /**
192 jsr166 1.25 * If triggered, helps release and/or process completions.
193 dl 1.20 */
194     final void helpPostComplete() {
195     if (result != null)
196     postComplete();
197     }
198    
199 dl 1.28 /* ------------- waiting for completions -------------- */
200 dl 1.20
201 dl 1.35 /** Number of processors, for spin control */
202     static final int NCPU = Runtime.getRuntime().availableProcessors();
203    
204 dl 1.1 /**
205 dl 1.28 * Heuristic spin value for waitingGet() before blocking on
206     * multiprocessors
207 dl 1.1 */
208 dl 1.35 static final int SPINS = (NCPU > 1) ? 1 << 8 : 0;
209 dl 1.1
210     /**
211 dl 1.28 * Linked nodes to record waiting threads in a Treiber stack. See
212     * other classes such as Phaser and SynchronousQueue for more
213     * detailed explanation. This class implements ManagedBlocker to
214     * avoid starvation when blocking actions pile up in
215     * ForkJoinPools.
216     */
217     static final class WaitNode implements ForkJoinPool.ManagedBlocker {
218     long nanos; // wait time if timed
219     final long deadline; // non-zero if timed
220     volatile int interruptControl; // > 0: interruptible, < 0: interrupted
221     volatile Thread thread;
222     volatile WaitNode next;
223     WaitNode(boolean interruptible, long nanos, long deadline) {
224     this.thread = Thread.currentThread();
225     this.interruptControl = interruptible ? 1 : 0;
226     this.nanos = nanos;
227     this.deadline = deadline;
228     }
229     public boolean isReleasable() {
230     if (thread == null)
231     return true;
232     if (Thread.interrupted()) {
233     int i = interruptControl;
234     interruptControl = -1;
235     if (i > 0)
236     return true;
237     }
238     if (deadline != 0L &&
239     (nanos <= 0L || (nanos = deadline - System.nanoTime()) <= 0L)) {
240     thread = null;
241     return true;
242     }
243     return false;
244     }
245     public boolean block() {
246     if (isReleasable())
247     return true;
248     else if (deadline == 0L)
249     LockSupport.park(this);
250     else if (nanos > 0L)
251     LockSupport.parkNanos(this, nanos);
252     return isReleasable();
253     }
254 dl 1.1 }
255    
256     /**
257 dl 1.28 * Returns raw result after waiting, or null if interruptible and
258     * interrupted.
259 dl 1.1 */
260 dl 1.28 private Object waitingGet(boolean interruptible) {
261     WaitNode q = null;
262     boolean queued = false;
263 dl 1.35 int spins = SPINS;
264 dl 1.28 for (Object r;;) {
265     if ((r = result) != null) {
266     if (q != null) { // suppress unpark
267     q.thread = null;
268     if (q.interruptControl < 0) {
269     if (interruptible) {
270     removeWaiter(q);
271     return null;
272     }
273     Thread.currentThread().interrupt();
274     }
275     }
276     postComplete(); // help release others
277     return r;
278     }
279     else if (spins > 0) {
280 dl 1.35 int rnd = ThreadLocalRandom.nextSecondarySeed();
281     if (rnd == 0)
282     rnd = ThreadLocalRandom.current().nextInt();
283     if (rnd >= 0)
284 dl 1.28 --spins;
285     }
286     else if (q == null)
287     q = new WaitNode(interruptible, 0L, 0L);
288     else if (!queued)
289     queued = UNSAFE.compareAndSwapObject(this, WAITERS,
290     q.next = waiters, q);
291     else if (interruptible && q.interruptControl < 0) {
292     removeWaiter(q);
293     return null;
294     }
295     else if (q.thread != null && result == null) {
296     try {
297     ForkJoinPool.managedBlock(q);
298 jsr166 1.31 } catch (InterruptedException ex) {
299 dl 1.28 q.interruptControl = -1;
300     }
301     }
302     }
303 dl 1.1 }
304    
305     /**
306 dl 1.28 * Awaits completion or aborts on interrupt or timeout.
307 dl 1.1 *
308 dl 1.28 * @param nanos time to wait
309     * @return raw result
310 dl 1.1 */
311 dl 1.28 private Object timedAwaitDone(long nanos)
312     throws InterruptedException, TimeoutException {
313     WaitNode q = null;
314     boolean queued = false;
315     for (Object r;;) {
316     if ((r = result) != null) {
317     if (q != null) {
318     q.thread = null;
319     if (q.interruptControl < 0) {
320     removeWaiter(q);
321     throw new InterruptedException();
322     }
323     }
324     postComplete();
325     return r;
326     }
327     else if (q == null) {
328     if (nanos <= 0L)
329     throw new TimeoutException();
330     long d = System.nanoTime() + nanos;
331 jsr166 1.31 q = new WaitNode(true, nanos, d == 0L ? 1L : d); // avoid 0
332 dl 1.28 }
333     else if (!queued)
334     queued = UNSAFE.compareAndSwapObject(this, WAITERS,
335     q.next = waiters, q);
336     else if (q.interruptControl < 0) {
337     removeWaiter(q);
338     throw new InterruptedException();
339     }
340     else if (q.nanos <= 0L) {
341     if (result == null) {
342     removeWaiter(q);
343     throw new TimeoutException();
344     }
345     }
346     else if (q.thread != null && result == null) {
347     try {
348     ForkJoinPool.managedBlock(q);
349 jsr166 1.31 } catch (InterruptedException ex) {
350 dl 1.28 q.interruptControl = -1;
351     }
352     }
353     }
354 dl 1.1 }
355    
356     /**
357 dl 1.28 * Tries to unlink a timed-out or interrupted wait node to avoid
358     * accumulating garbage. Internal nodes are simply unspliced
359     * without CAS since it is harmless if they are traversed anyway
360     * by releasers. To avoid effects of unsplicing from already
361     * removed nodes, the list is retraversed in case of an apparent
362     * race. This is slow when there are a lot of nodes, but we don't
363     * expect lists to be long enough to outweigh higher-overhead
364     * schemes.
365 dl 1.1 */
366 dl 1.28 private void removeWaiter(WaitNode node) {
367     if (node != null) {
368     node.thread = null;
369     retry:
370     for (;;) { // restart on removeWaiter race
371     for (WaitNode pred = null, q = waiters, s; q != null; q = s) {
372     s = q.next;
373     if (q.thread != null)
374     pred = q;
375     else if (pred != null) {
376     pred.next = s;
377     if (pred.thread == null) // check for race
378     continue retry;
379     }
380     else if (!UNSAFE.compareAndSwapObject(this, WAITERS, q, s))
381     continue retry;
382     }
383     break;
384     }
385     }
386 dl 1.1 }
387    
388 dl 1.28 /* ------------- Async tasks -------------- */
389    
390 dl 1.1 /**
391 jsr166 1.56 * A marker interface identifying asynchronous tasks produced by
392 dl 1.28 * {@code async} methods. This may be useful for monitoring,
393     * debugging, and tracking asynchronous activities.
394 jsr166 1.57 *
395     * @since 1.8
396 dl 1.1 */
397 dl 1.28 public static interface AsynchronousCompletionTask {
398 dl 1.1 }
399    
400 dl 1.28 /** Base class can act as either FJ or plain Runnable */
401 jsr166 1.33 abstract static class Async extends ForkJoinTask<Void>
402 dl 1.28 implements Runnable, AsynchronousCompletionTask {
403     public final Void getRawResult() { return null; }
404     public final void setRawResult(Void v) { }
405     public final void run() { exec(); }
406 jsr166 1.26 }
407    
408 dl 1.28 static final class AsyncRun extends Async {
409     final Runnable fn;
410     final CompletableFuture<Void> dst;
411     AsyncRun(Runnable fn, CompletableFuture<Void> dst) {
412     this.fn = fn; this.dst = dst;
413     }
414     public final boolean exec() {
415     CompletableFuture<Void> d; Throwable ex;
416 dl 1.29 if ((d = this.dst) != null && d.result == null) {
417 dl 1.28 try {
418     fn.run();
419     ex = null;
420     } catch (Throwable rex) {
421     ex = rex;
422     }
423     d.internalComplete(null, ex);
424 dl 1.19 }
425 dl 1.28 return true;
426 dl 1.19 }
427 dl 1.28 private static final long serialVersionUID = 5232453952276885070L;
428 dl 1.19 }
429    
430 dl 1.28 static final class AsyncSupply<U> extends Async {
431     final Supplier<U> fn;
432     final CompletableFuture<U> dst;
433     AsyncSupply(Supplier<U> fn, CompletableFuture<U> dst) {
434     this.fn = fn; this.dst = dst;
435     }
436     public final boolean exec() {
437     CompletableFuture<U> d; U u; Throwable ex;
438 dl 1.29 if ((d = this.dst) != null && d.result == null) {
439 dl 1.28 try {
440     u = fn.get();
441     ex = null;
442     } catch (Throwable rex) {
443     ex = rex;
444     u = null;
445     }
446     d.internalComplete(u, ex);
447 dl 1.1 }
448     return true;
449     }
450     private static final long serialVersionUID = 5232453952276885070L;
451     }
452    
453 dl 1.28 static final class AsyncApply<T,U> extends Async {
454 jsr166 1.63 final T arg;
455 dl 1.28 final Function<? super T,? extends U> fn;
456 dl 1.1 final CompletableFuture<U> dst;
457 dl 1.28 AsyncApply(T arg, Function<? super T,? extends U> fn,
458 dl 1.35 CompletableFuture<U> dst) {
459 dl 1.1 this.arg = arg; this.fn = fn; this.dst = dst;
460     }
461     public final boolean exec() {
462 dl 1.21 CompletableFuture<U> d; U u; Throwable ex;
463 dl 1.29 if ((d = this.dst) != null && d.result == null) {
464 dl 1.21 try {
465     u = fn.apply(arg);
466     ex = null;
467     } catch (Throwable rex) {
468     ex = rex;
469     u = null;
470     }
471     d.internalComplete(u, ex);
472 dl 1.1 }
473     return true;
474     }
475     private static final long serialVersionUID = 5232453952276885070L;
476     }
477    
478 dl 1.28 static final class AsyncBiApply<T,U,V> extends Async {
479 dl 1.1 final T arg1;
480     final U arg2;
481 jsr166 1.63 final BiFunction<? super T,? super U,? extends V> fn;
482 dl 1.1 final CompletableFuture<V> dst;
483 dl 1.28 AsyncBiApply(T arg1, U arg2,
484 dl 1.35 BiFunction<? super T,? super U,? extends V> fn,
485     CompletableFuture<V> dst) {
486 dl 1.1 this.arg1 = arg1; this.arg2 = arg2; this.fn = fn; this.dst = dst;
487     }
488     public final boolean exec() {
489 dl 1.21 CompletableFuture<V> d; V v; Throwable ex;
490 dl 1.29 if ((d = this.dst) != null && d.result == null) {
491 dl 1.21 try {
492     v = fn.apply(arg1, arg2);
493     ex = null;
494     } catch (Throwable rex) {
495     ex = rex;
496     v = null;
497     }
498     d.internalComplete(v, ex);
499 dl 1.1 }
500     return true;
501     }
502     private static final long serialVersionUID = 5232453952276885070L;
503     }
504    
505 dl 1.28 static final class AsyncAccept<T> extends Async {
506 jsr166 1.63 final T arg;
507 dl 1.34 final Consumer<? super T> fn;
508 dl 1.7 final CompletableFuture<Void> dst;
509 dl 1.34 AsyncAccept(T arg, Consumer<? super T> fn,
510 dl 1.35 CompletableFuture<Void> dst) {
511 dl 1.7 this.arg = arg; this.fn = fn; this.dst = dst;
512     }
513     public final boolean exec() {
514 dl 1.21 CompletableFuture<Void> d; Throwable ex;
515 dl 1.29 if ((d = this.dst) != null && d.result == null) {
516 dl 1.21 try {
517     fn.accept(arg);
518     ex = null;
519     } catch (Throwable rex) {
520     ex = rex;
521     }
522     d.internalComplete(null, ex);
523 dl 1.7 }
524     return true;
525     }
526     private static final long serialVersionUID = 5232453952276885070L;
527     }
528    
529 dl 1.28 static final class AsyncBiAccept<T,U> extends Async {
530 dl 1.7 final T arg1;
531     final U arg2;
532 jsr166 1.63 final BiConsumer<? super T,? super U> fn;
533 dl 1.7 final CompletableFuture<Void> dst;
534 dl 1.28 AsyncBiAccept(T arg1, U arg2,
535 dl 1.35 BiConsumer<? super T,? super U> fn,
536     CompletableFuture<Void> dst) {
537 dl 1.7 this.arg1 = arg1; this.arg2 = arg2; this.fn = fn; this.dst = dst;
538     }
539     public final boolean exec() {
540 dl 1.21 CompletableFuture<Void> d; Throwable ex;
541 dl 1.29 if ((d = this.dst) != null && d.result == null) {
542 dl 1.21 try {
543     fn.accept(arg1, arg2);
544     ex = null;
545     } catch (Throwable rex) {
546     ex = rex;
547     }
548     d.internalComplete(null, ex);
549 dl 1.7 }
550     return true;
551     }
552     private static final long serialVersionUID = 5232453952276885070L;
553     }
554    
555 dl 1.37 static final class AsyncCompose<T,U> extends Async {
556 jsr166 1.63 final T arg;
557 dl 1.37 final Function<? super T, CompletableFuture<U>> fn;
558     final CompletableFuture<U> dst;
559     AsyncCompose(T arg,
560     Function<? super T, CompletableFuture<U>> fn,
561     CompletableFuture<U> dst) {
562     this.arg = arg; this.fn = fn; this.dst = dst;
563     }
564     public final boolean exec() {
565     CompletableFuture<U> d, fr; U u; Throwable ex;
566     if ((d = this.dst) != null && d.result == null) {
567     try {
568     fr = fn.apply(arg);
569 jsr166 1.61 ex = (fr == null) ? new NullPointerException() : null;
570 dl 1.37 } catch (Throwable rex) {
571     ex = rex;
572     fr = null;
573     }
574     if (ex != null)
575     u = null;
576     else {
577     Object r = fr.result;
578 dl 1.67 if (r == null)
579     r = fr.waitingGet(false);
580 dl 1.37 if (r instanceof AltResult) {
581     ex = ((AltResult)r).ex;
582     u = null;
583     }
584     else {
585     @SuppressWarnings("unchecked") U ur = (U) r;
586     u = ur;
587     }
588     }
589     d.internalComplete(u, ex);
590     }
591     return true;
592     }
593     private static final long serialVersionUID = 5232453952276885070L;
594     }
595    
596 dl 1.1 /* ------------- Completions -------------- */
597    
598 dl 1.28 /**
599     * Simple linked list nodes to record completions, used in
600     * basically the same way as WaitNodes. (We separate nodes from
601     * the Completions themselves mainly because for the And and Or
602     * methods, the same Completion object resides in two lists.)
603     */
604     static final class CompletionNode {
605     final Completion completion;
606     volatile CompletionNode next;
607     CompletionNode(Completion completion) { this.completion = completion; }
608     }
609    
610 dl 1.1 // Opportunistically subclass AtomicInteger to use compareAndSet to claim.
611 jsr166 1.33 abstract static class Completion extends AtomicInteger implements Runnable {
612 dl 1.1 }
613    
614 dl 1.28 static final class ApplyCompletion<T,U> extends Completion {
615 jsr166 1.2 final CompletableFuture<? extends T> src;
616     final Function<? super T,? extends U> fn;
617     final CompletableFuture<U> dst;
618 dl 1.1 final Executor executor;
619 dl 1.28 ApplyCompletion(CompletableFuture<? extends T> src,
620     Function<? super T,? extends U> fn,
621     CompletableFuture<U> dst, Executor executor) {
622 dl 1.1 this.src = src; this.fn = fn; this.dst = dst;
623     this.executor = executor;
624     }
625 jsr166 1.26 public final void run() {
626 dl 1.28 final CompletableFuture<? extends T> a;
627     final Function<? super T,? extends U> fn;
628     final CompletableFuture<U> dst;
629 jsr166 1.2 Object r; T t; Throwable ex;
630     if ((dst = this.dst) != null &&
631 dl 1.1 (fn = this.fn) != null &&
632     (a = this.src) != null &&
633     (r = a.result) != null &&
634     compareAndSet(0, 1)) {
635 jsr166 1.2 if (r instanceof AltResult) {
636 dl 1.19 ex = ((AltResult)r).ex;
637 dl 1.1 t = null;
638     }
639 dl 1.17 else {
640     ex = null;
641 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
642     t = tr;
643 dl 1.1 }
644 dl 1.20 Executor e = executor;
645     U u = null;
646 dl 1.17 if (ex == null) {
647     try {
648 dl 1.20 if (e != null)
649 dl 1.28 e.execute(new AsyncApply<T,U>(t, fn, dst));
650 dl 1.17 else
651 dl 1.20 u = fn.apply(t);
652 dl 1.17 } catch (Throwable rex) {
653     ex = rex;
654     }
655     }
656 dl 1.20 if (e == null || ex != null)
657     dst.internalComplete(u, ex);
658 dl 1.1 }
659     }
660 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
661 dl 1.1 }
662    
663 dl 1.28 static final class AcceptCompletion<T> extends Completion {
664 dl 1.7 final CompletableFuture<? extends T> src;
665 dl 1.34 final Consumer<? super T> fn;
666 dl 1.7 final CompletableFuture<Void> dst;
667     final Executor executor;
668 dl 1.28 AcceptCompletion(CompletableFuture<? extends T> src,
669 dl 1.34 Consumer<? super T> fn,
670 dl 1.28 CompletableFuture<Void> dst, Executor executor) {
671 dl 1.7 this.src = src; this.fn = fn; this.dst = dst;
672     this.executor = executor;
673     }
674 jsr166 1.26 public final void run() {
675 dl 1.28 final CompletableFuture<? extends T> a;
676 dl 1.34 final Consumer<? super T> fn;
677 dl 1.28 final CompletableFuture<Void> dst;
678 dl 1.7 Object r; T t; Throwable ex;
679     if ((dst = this.dst) != null &&
680     (fn = this.fn) != null &&
681     (a = this.src) != null &&
682     (r = a.result) != null &&
683     compareAndSet(0, 1)) {
684     if (r instanceof AltResult) {
685 dl 1.19 ex = ((AltResult)r).ex;
686 dl 1.7 t = null;
687     }
688 dl 1.17 else {
689     ex = null;
690 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
691     t = tr;
692 dl 1.17 }
693 dl 1.20 Executor e = executor;
694 dl 1.17 if (ex == null) {
695     try {
696 dl 1.20 if (e != null)
697 dl 1.28 e.execute(new AsyncAccept<T>(t, fn, dst));
698 dl 1.20 else
699 dl 1.17 fn.accept(t);
700     } catch (Throwable rex) {
701     ex = rex;
702 dl 1.7 }
703     }
704 dl 1.20 if (e == null || ex != null)
705     dst.internalComplete(null, ex);
706 dl 1.7 }
707     }
708 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
709 dl 1.7 }
710    
711 dl 1.28 static final class RunCompletion<T> extends Completion {
712 jsr166 1.2 final CompletableFuture<? extends T> src;
713     final Runnable fn;
714     final CompletableFuture<Void> dst;
715 dl 1.1 final Executor executor;
716 dl 1.28 RunCompletion(CompletableFuture<? extends T> src,
717     Runnable fn,
718     CompletableFuture<Void> dst,
719     Executor executor) {
720 dl 1.1 this.src = src; this.fn = fn; this.dst = dst;
721     this.executor = executor;
722     }
723 jsr166 1.26 public final void run() {
724 dl 1.28 final CompletableFuture<? extends T> a;
725     final Runnable fn;
726     final CompletableFuture<Void> dst;
727 jsr166 1.2 Object r; Throwable ex;
728     if ((dst = this.dst) != null &&
729 dl 1.1 (fn = this.fn) != null &&
730     (a = this.src) != null &&
731     (r = a.result) != null &&
732     compareAndSet(0, 1)) {
733 dl 1.19 if (r instanceof AltResult)
734     ex = ((AltResult)r).ex;
735 dl 1.17 else
736     ex = null;
737 dl 1.20 Executor e = executor;
738 dl 1.17 if (ex == null) {
739     try {
740 dl 1.20 if (e != null)
741 dl 1.28 e.execute(new AsyncRun(fn, dst));
742 dl 1.20 else
743 dl 1.17 fn.run();
744     } catch (Throwable rex) {
745     ex = rex;
746 dl 1.1 }
747     }
748 dl 1.20 if (e == null || ex != null)
749     dst.internalComplete(null, ex);
750 dl 1.1 }
751     }
752 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
753 dl 1.1 }
754    
755 dl 1.28 static final class BiApplyCompletion<T,U,V> extends Completion {
756 jsr166 1.2 final CompletableFuture<? extends T> src;
757     final CompletableFuture<? extends U> snd;
758     final BiFunction<? super T,? super U,? extends V> fn;
759     final CompletableFuture<V> dst;
760 dl 1.1 final Executor executor;
761 dl 1.28 BiApplyCompletion(CompletableFuture<? extends T> src,
762     CompletableFuture<? extends U> snd,
763     BiFunction<? super T,? super U,? extends V> fn,
764     CompletableFuture<V> dst, Executor executor) {
765 dl 1.1 this.src = src; this.snd = snd;
766     this.fn = fn; this.dst = dst;
767     this.executor = executor;
768     }
769 jsr166 1.26 public final void run() {
770 dl 1.28 final CompletableFuture<? extends T> a;
771     final CompletableFuture<? extends U> b;
772     final BiFunction<? super T,? super U,? extends V> fn;
773     final CompletableFuture<V> dst;
774 jsr166 1.2 Object r, s; T t; U u; Throwable ex;
775     if ((dst = this.dst) != null &&
776 dl 1.1 (fn = this.fn) != null &&
777     (a = this.src) != null &&
778     (r = a.result) != null &&
779     (b = this.snd) != null &&
780     (s = b.result) != null &&
781     compareAndSet(0, 1)) {
782 jsr166 1.2 if (r instanceof AltResult) {
783 dl 1.19 ex = ((AltResult)r).ex;
784 jsr166 1.2 t = null;
785     }
786 dl 1.19 else {
787     ex = null;
788 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
789     t = tr;
790 dl 1.19 }
791     if (ex != null)
792     u = null;
793     else if (s instanceof AltResult) {
794     ex = ((AltResult)s).ex;
795 jsr166 1.2 u = null;
796     }
797 dl 1.28 else {
798     @SuppressWarnings("unchecked") U us = (U) s;
799     u = us;
800     }
801 dl 1.20 Executor e = executor;
802     V v = null;
803 dl 1.19 if (ex == null) {
804     try {
805 dl 1.20 if (e != null)
806 dl 1.28 e.execute(new AsyncBiApply<T,U,V>(t, u, fn, dst));
807 dl 1.19 else
808 dl 1.20 v = fn.apply(t, u);
809 dl 1.19 } catch (Throwable rex) {
810     ex = rex;
811     }
812 dl 1.1 }
813 dl 1.20 if (e == null || ex != null)
814     dst.internalComplete(v, ex);
815 jsr166 1.2 }
816     }
817 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
818 dl 1.1 }
819    
820 dl 1.28 static final class BiAcceptCompletion<T,U> extends Completion {
821 dl 1.7 final CompletableFuture<? extends T> src;
822     final CompletableFuture<? extends U> snd;
823 dl 1.34 final BiConsumer<? super T,? super U> fn;
824 dl 1.7 final CompletableFuture<Void> dst;
825     final Executor executor;
826 dl 1.28 BiAcceptCompletion(CompletableFuture<? extends T> src,
827     CompletableFuture<? extends U> snd,
828 dl 1.34 BiConsumer<? super T,? super U> fn,
829 dl 1.28 CompletableFuture<Void> dst, Executor executor) {
830 dl 1.7 this.src = src; this.snd = snd;
831     this.fn = fn; this.dst = dst;
832     this.executor = executor;
833     }
834 jsr166 1.26 public final void run() {
835 dl 1.28 final CompletableFuture<? extends T> a;
836     final CompletableFuture<? extends U> b;
837 dl 1.34 final BiConsumer<? super T,? super U> fn;
838 dl 1.28 final CompletableFuture<Void> dst;
839 dl 1.7 Object r, s; T t; U u; Throwable ex;
840     if ((dst = this.dst) != null &&
841     (fn = this.fn) != null &&
842     (a = this.src) != null &&
843     (r = a.result) != null &&
844     (b = this.snd) != null &&
845     (s = b.result) != null &&
846     compareAndSet(0, 1)) {
847     if (r instanceof AltResult) {
848 dl 1.19 ex = ((AltResult)r).ex;
849 dl 1.7 t = null;
850     }
851 dl 1.19 else {
852     ex = null;
853 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
854     t = tr;
855 dl 1.19 }
856     if (ex != null)
857     u = null;
858     else if (s instanceof AltResult) {
859     ex = ((AltResult)s).ex;
860 dl 1.7 u = null;
861     }
862 dl 1.28 else {
863     @SuppressWarnings("unchecked") U us = (U) s;
864     u = us;
865     }
866 dl 1.20 Executor e = executor;
867 dl 1.19 if (ex == null) {
868     try {
869 dl 1.20 if (e != null)
870 dl 1.28 e.execute(new AsyncBiAccept<T,U>(t, u, fn, dst));
871 dl 1.20 else
872 dl 1.19 fn.accept(t, u);
873     } catch (Throwable rex) {
874     ex = rex;
875 dl 1.7 }
876     }
877 dl 1.20 if (e == null || ex != null)
878     dst.internalComplete(null, ex);
879 dl 1.7 }
880     }
881 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
882 dl 1.7 }
883    
884 dl 1.28 static final class BiRunCompletion<T> extends Completion {
885 jsr166 1.2 final CompletableFuture<? extends T> src;
886     final CompletableFuture<?> snd;
887     final Runnable fn;
888     final CompletableFuture<Void> dst;
889 dl 1.1 final Executor executor;
890 dl 1.28 BiRunCompletion(CompletableFuture<? extends T> src,
891     CompletableFuture<?> snd,
892     Runnable fn,
893     CompletableFuture<Void> dst, Executor executor) {
894 dl 1.1 this.src = src; this.snd = snd;
895     this.fn = fn; this.dst = dst;
896     this.executor = executor;
897     }
898 jsr166 1.26 public final void run() {
899 dl 1.1 final CompletableFuture<? extends T> a;
900     final CompletableFuture<?> b;
901     final Runnable fn;
902     final CompletableFuture<Void> dst;
903 dl 1.28 Object r, s; Throwable ex;
904 jsr166 1.2 if ((dst = this.dst) != null &&
905 dl 1.1 (fn = this.fn) != null &&
906     (a = this.src) != null &&
907     (r = a.result) != null &&
908     (b = this.snd) != null &&
909     (s = b.result) != null &&
910     compareAndSet(0, 1)) {
911 dl 1.19 if (r instanceof AltResult)
912     ex = ((AltResult)r).ex;
913     else
914     ex = null;
915     if (ex == null && (s instanceof AltResult))
916     ex = ((AltResult)s).ex;
917 dl 1.20 Executor e = executor;
918 dl 1.19 if (ex == null) {
919     try {
920 dl 1.20 if (e != null)
921 dl 1.28 e.execute(new AsyncRun(fn, dst));
922 dl 1.20 else
923 dl 1.19 fn.run();
924     } catch (Throwable rex) {
925     ex = rex;
926 dl 1.1 }
927 jsr166 1.2 }
928 dl 1.20 if (e == null || ex != null)
929     dst.internalComplete(null, ex);
930 jsr166 1.2 }
931     }
932 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
933 dl 1.1 }
934    
935 dl 1.35 static final class AndCompletion extends Completion {
936     final CompletableFuture<?> src;
937     final CompletableFuture<?> snd;
938     final CompletableFuture<Void> dst;
939     AndCompletion(CompletableFuture<?> src,
940     CompletableFuture<?> snd,
941     CompletableFuture<Void> dst) {
942     this.src = src; this.snd = snd; this.dst = dst;
943     }
944     public final void run() {
945     final CompletableFuture<?> a;
946     final CompletableFuture<?> b;
947     final CompletableFuture<Void> dst;
948     Object r, s; Throwable ex;
949     if ((dst = this.dst) != null &&
950     (a = this.src) != null &&
951     (r = a.result) != null &&
952     (b = this.snd) != null &&
953     (s = b.result) != null &&
954     compareAndSet(0, 1)) {
955     if (r instanceof AltResult)
956     ex = ((AltResult)r).ex;
957     else
958     ex = null;
959     if (ex == null && (s instanceof AltResult))
960     ex = ((AltResult)s).ex;
961     dst.internalComplete(null, ex);
962     }
963     }
964     private static final long serialVersionUID = 5232453952276885070L;
965     }
966    
967 dl 1.28 static final class OrApplyCompletion<T,U> extends Completion {
968 jsr166 1.2 final CompletableFuture<? extends T> src;
969     final CompletableFuture<? extends T> snd;
970     final Function<? super T,? extends U> fn;
971     final CompletableFuture<U> dst;
972 dl 1.1 final Executor executor;
973 dl 1.28 OrApplyCompletion(CompletableFuture<? extends T> src,
974     CompletableFuture<? extends T> snd,
975     Function<? super T,? extends U> fn,
976     CompletableFuture<U> dst, Executor executor) {
977 dl 1.1 this.src = src; this.snd = snd;
978     this.fn = fn; this.dst = dst;
979     this.executor = executor;
980     }
981 jsr166 1.26 public final void run() {
982 dl 1.28 final CompletableFuture<? extends T> a;
983     final CompletableFuture<? extends T> b;
984     final Function<? super T,? extends U> fn;
985     final CompletableFuture<U> dst;
986 jsr166 1.2 Object r; T t; Throwable ex;
987     if ((dst = this.dst) != null &&
988 dl 1.1 (fn = this.fn) != null &&
989     (((a = this.src) != null && (r = a.result) != null) ||
990     ((b = this.snd) != null && (r = b.result) != null)) &&
991     compareAndSet(0, 1)) {
992 jsr166 1.2 if (r instanceof AltResult) {
993 dl 1.19 ex = ((AltResult)r).ex;
994 jsr166 1.2 t = null;
995     }
996 dl 1.19 else {
997     ex = null;
998 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
999     t = tr;
1000 dl 1.1 }
1001 dl 1.20 Executor e = executor;
1002     U u = null;
1003 dl 1.19 if (ex == null) {
1004     try {
1005 dl 1.20 if (e != null)
1006 dl 1.28 e.execute(new AsyncApply<T,U>(t, fn, dst));
1007 dl 1.19 else
1008 dl 1.20 u = fn.apply(t);
1009 dl 1.19 } catch (Throwable rex) {
1010     ex = rex;
1011     }
1012     }
1013 dl 1.20 if (e == null || ex != null)
1014     dst.internalComplete(u, ex);
1015 jsr166 1.2 }
1016     }
1017 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
1018 dl 1.1 }
1019    
1020 dl 1.28 static final class OrAcceptCompletion<T> extends Completion {
1021 dl 1.7 final CompletableFuture<? extends T> src;
1022     final CompletableFuture<? extends T> snd;
1023 dl 1.34 final Consumer<? super T> fn;
1024 dl 1.7 final CompletableFuture<Void> dst;
1025     final Executor executor;
1026 dl 1.28 OrAcceptCompletion(CompletableFuture<? extends T> src,
1027     CompletableFuture<? extends T> snd,
1028 dl 1.34 Consumer<? super T> fn,
1029 dl 1.28 CompletableFuture<Void> dst, Executor executor) {
1030 dl 1.7 this.src = src; this.snd = snd;
1031     this.fn = fn; this.dst = dst;
1032     this.executor = executor;
1033     }
1034 jsr166 1.26 public final void run() {
1035 dl 1.28 final CompletableFuture<? extends T> a;
1036     final CompletableFuture<? extends T> b;
1037 dl 1.34 final Consumer<? super T> fn;
1038 dl 1.28 final CompletableFuture<Void> dst;
1039 dl 1.7 Object r; T t; Throwable ex;
1040     if ((dst = this.dst) != null &&
1041     (fn = this.fn) != null &&
1042     (((a = this.src) != null && (r = a.result) != null) ||
1043     ((b = this.snd) != null && (r = b.result) != null)) &&
1044     compareAndSet(0, 1)) {
1045     if (r instanceof AltResult) {
1046 dl 1.19 ex = ((AltResult)r).ex;
1047 dl 1.7 t = null;
1048     }
1049 dl 1.19 else {
1050     ex = null;
1051 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
1052     t = tr;
1053 dl 1.19 }
1054 dl 1.20 Executor e = executor;
1055 dl 1.19 if (ex == null) {
1056     try {
1057 dl 1.20 if (e != null)
1058 dl 1.28 e.execute(new AsyncAccept<T>(t, fn, dst));
1059 dl 1.20 else
1060 dl 1.19 fn.accept(t);
1061     } catch (Throwable rex) {
1062     ex = rex;
1063 dl 1.7 }
1064     }
1065 dl 1.20 if (e == null || ex != null)
1066     dst.internalComplete(null, ex);
1067 dl 1.7 }
1068     }
1069 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
1070 dl 1.7 }
1071    
1072 dl 1.28 static final class OrRunCompletion<T> extends Completion {
1073 jsr166 1.2 final CompletableFuture<? extends T> src;
1074     final CompletableFuture<?> snd;
1075     final Runnable fn;
1076     final CompletableFuture<Void> dst;
1077 dl 1.1 final Executor executor;
1078 dl 1.28 OrRunCompletion(CompletableFuture<? extends T> src,
1079     CompletableFuture<?> snd,
1080     Runnable fn,
1081     CompletableFuture<Void> dst, Executor executor) {
1082 dl 1.1 this.src = src; this.snd = snd;
1083     this.fn = fn; this.dst = dst;
1084     this.executor = executor;
1085     }
1086 jsr166 1.26 public final void run() {
1087 dl 1.28 final CompletableFuture<? extends T> a;
1088 dl 1.1 final CompletableFuture<?> b;
1089     final Runnable fn;
1090     final CompletableFuture<Void> dst;
1091 dl 1.28 Object r; Throwable ex;
1092 jsr166 1.2 if ((dst = this.dst) != null &&
1093 dl 1.1 (fn = this.fn) != null &&
1094     (((a = this.src) != null && (r = a.result) != null) ||
1095     ((b = this.snd) != null && (r = b.result) != null)) &&
1096     compareAndSet(0, 1)) {
1097 dl 1.19 if (r instanceof AltResult)
1098     ex = ((AltResult)r).ex;
1099     else
1100     ex = null;
1101 dl 1.20 Executor e = executor;
1102 dl 1.19 if (ex == null) {
1103 dl 1.1 try {
1104 dl 1.20 if (e != null)
1105 dl 1.28 e.execute(new AsyncRun(fn, dst));
1106 dl 1.20 else
1107 dl 1.1 fn.run();
1108     } catch (Throwable rex) {
1109 dl 1.19 ex = rex;
1110 dl 1.1 }
1111     }
1112 dl 1.20 if (e == null || ex != null)
1113     dst.internalComplete(null, ex);
1114 jsr166 1.2 }
1115     }
1116 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
1117 dl 1.1 }
1118    
1119 dl 1.35 static final class OrCompletion extends Completion {
1120     final CompletableFuture<?> src;
1121     final CompletableFuture<?> snd;
1122     final CompletableFuture<?> dst;
1123     OrCompletion(CompletableFuture<?> src,
1124     CompletableFuture<?> snd,
1125     CompletableFuture<?> dst) {
1126     this.src = src; this.snd = snd; this.dst = dst;
1127     }
1128     public final void run() {
1129     final CompletableFuture<?> a;
1130     final CompletableFuture<?> b;
1131     final CompletableFuture<?> dst;
1132     Object r, t; Throwable ex;
1133     if ((dst = this.dst) != null &&
1134     (((a = this.src) != null && (r = a.result) != null) ||
1135     ((b = this.snd) != null && (r = b.result) != null)) &&
1136     compareAndSet(0, 1)) {
1137     if (r instanceof AltResult) {
1138     ex = ((AltResult)r).ex;
1139     t = null;
1140     }
1141     else {
1142     ex = null;
1143     t = r;
1144     }
1145     dst.internalComplete(t, ex);
1146     }
1147     }
1148     private static final long serialVersionUID = 5232453952276885070L;
1149     }
1150    
1151 dl 1.28 static final class ExceptionCompletion<T> extends Completion {
1152 jsr166 1.2 final CompletableFuture<? extends T> src;
1153 dl 1.6 final Function<? super Throwable, ? extends T> fn;
1154     final CompletableFuture<T> dst;
1155 dl 1.28 ExceptionCompletion(CompletableFuture<? extends T> src,
1156     Function<? super Throwable, ? extends T> fn,
1157     CompletableFuture<T> dst) {
1158 dl 1.1 this.src = src; this.fn = fn; this.dst = dst;
1159     }
1160 jsr166 1.26 public final void run() {
1161 dl 1.28 final CompletableFuture<? extends T> a;
1162     final Function<? super Throwable, ? extends T> fn;
1163     final CompletableFuture<T> dst;
1164 dl 1.20 Object r; T t = null; Throwable ex, dx = null;
1165 jsr166 1.2 if ((dst = this.dst) != null &&
1166 dl 1.1 (fn = this.fn) != null &&
1167     (a = this.src) != null &&
1168     (r = a.result) != null &&
1169     compareAndSet(0, 1)) {
1170 dl 1.20 if ((r instanceof AltResult) &&
1171     (ex = ((AltResult)r).ex) != null) {
1172     try {
1173     t = fn.apply(ex);
1174     } catch (Throwable rex) {
1175     dx = rex;
1176 dl 1.1 }
1177     }
1178 dl 1.28 else {
1179     @SuppressWarnings("unchecked") T tr = (T) r;
1180     t = tr;
1181     }
1182 dl 1.20 dst.internalComplete(t, dx);
1183 dl 1.1 }
1184     }
1185 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
1186 dl 1.1 }
1187    
1188 dl 1.35 static final class ThenCopy extends Completion {
1189     final CompletableFuture<?> src;
1190     final CompletableFuture<?> dst;
1191     ThenCopy(CompletableFuture<?> src,
1192     CompletableFuture<?> dst) {
1193 dl 1.17 this.src = src; this.dst = dst;
1194     }
1195 jsr166 1.26 public final void run() {
1196 dl 1.35 final CompletableFuture<?> a;
1197     final CompletableFuture<?> dst;
1198 dl 1.20 Object r; Object t; Throwable ex;
1199 dl 1.17 if ((dst = this.dst) != null &&
1200     (a = this.src) != null &&
1201     (r = a.result) != null &&
1202     compareAndSet(0, 1)) {
1203 dl 1.20 if (r instanceof AltResult) {
1204     ex = ((AltResult)r).ex;
1205     t = null;
1206     }
1207     else {
1208     ex = null;
1209     t = r;
1210     }
1211     dst.internalComplete(t, ex);
1212 dl 1.17 }
1213     }
1214 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
1215 dl 1.17 }
1216    
1217 dl 1.28 static final class HandleCompletion<T,U> extends Completion {
1218 dl 1.17 final CompletableFuture<? extends T> src;
1219     final BiFunction<? super T, Throwable, ? extends U> fn;
1220     final CompletableFuture<U> dst;
1221 dl 1.28 HandleCompletion(CompletableFuture<? extends T> src,
1222     BiFunction<? super T, Throwable, ? extends U> fn,
1223 jsr166 1.64 CompletableFuture<U> dst) {
1224 dl 1.17 this.src = src; this.fn = fn; this.dst = dst;
1225     }
1226 jsr166 1.26 public final void run() {
1227 dl 1.28 final CompletableFuture<? extends T> a;
1228     final BiFunction<? super T, Throwable, ? extends U> fn;
1229     final CompletableFuture<U> dst;
1230 dl 1.17 Object r; T t; Throwable ex;
1231     if ((dst = this.dst) != null &&
1232     (fn = this.fn) != null &&
1233     (a = this.src) != null &&
1234     (r = a.result) != null &&
1235     compareAndSet(0, 1)) {
1236     if (r instanceof AltResult) {
1237     ex = ((AltResult)r).ex;
1238     t = null;
1239     }
1240     else {
1241     ex = null;
1242 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
1243     t = tr;
1244 dl 1.17 }
1245 dl 1.20 U u = null; Throwable dx = null;
1246 dl 1.17 try {
1247 dl 1.20 u = fn.apply(t, ex);
1248 dl 1.17 } catch (Throwable rex) {
1249 dl 1.20 dx = rex;
1250 dl 1.17 }
1251 dl 1.20 dst.internalComplete(u, dx);
1252 dl 1.17 }
1253     }
1254 dl 1.20 private static final long serialVersionUID = 5232453952276885070L;
1255 dl 1.17 }
1256    
1257 dl 1.28 static final class ComposeCompletion<T,U> extends Completion {
1258 dl 1.17 final CompletableFuture<? extends T> src;
1259     final Function<? super T, CompletableFuture<U>> fn;
1260     final CompletableFuture<U> dst;
1261 dl 1.37 final Executor executor;
1262 dl 1.28 ComposeCompletion(CompletableFuture<? extends T> src,
1263     Function<? super T, CompletableFuture<U>> fn,
1264 jsr166 1.64 CompletableFuture<U> dst, Executor executor) {
1265 dl 1.17 this.src = src; this.fn = fn; this.dst = dst;
1266 dl 1.37 this.executor = executor;
1267 dl 1.17 }
1268 jsr166 1.26 public final void run() {
1269 dl 1.28 final CompletableFuture<? extends T> a;
1270     final Function<? super T, CompletableFuture<U>> fn;
1271     final CompletableFuture<U> dst;
1272 dl 1.37 Object r; T t; Throwable ex; Executor e;
1273 dl 1.17 if ((dst = this.dst) != null &&
1274     (fn = this.fn) != null &&
1275     (a = this.src) != null &&
1276     (r = a.result) != null &&
1277     compareAndSet(0, 1)) {
1278     if (r instanceof AltResult) {
1279     ex = ((AltResult)r).ex;
1280     t = null;
1281     }
1282     else {
1283     ex = null;
1284 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
1285     t = tr;
1286 dl 1.17 }
1287     CompletableFuture<U> c = null;
1288 dl 1.20 U u = null;
1289     boolean complete = false;
1290 dl 1.17 if (ex == null) {
1291 dl 1.37 if ((e = executor) != null)
1292     e.execute(new AsyncCompose<T,U>(t, fn, dst));
1293     else {
1294     try {
1295     if ((c = fn.apply(t)) == null)
1296     ex = new NullPointerException();
1297     } catch (Throwable rex) {
1298     ex = rex;
1299     }
1300 dl 1.17 }
1301     }
1302 dl 1.37 if (c != null) {
1303 dl 1.35 ThenCopy d = null;
1304 dl 1.18 Object s;
1305     if ((s = c.result) == null) {
1306     CompletionNode p = new CompletionNode
1307 dl 1.35 (d = new ThenCopy(c, dst));
1308 dl 1.18 while ((s = c.result) == null) {
1309     if (UNSAFE.compareAndSwapObject
1310     (c, COMPLETIONS, p.next = c.completions, p))
1311     break;
1312     }
1313 dl 1.17 }
1314 dl 1.18 if (s != null && (d == null || d.compareAndSet(0, 1))) {
1315 dl 1.20 complete = true;
1316 dl 1.18 if (s instanceof AltResult) {
1317     ex = ((AltResult)s).ex; // no rewrap
1318     u = null;
1319 dl 1.28 }
1320     else {
1321     @SuppressWarnings("unchecked") U us = (U) s;
1322     u = us;
1323     }
1324     }
1325     }
1326     if (complete || ex != null)
1327     dst.internalComplete(u, ex);
1328     if (c != null)
1329     c.helpPostComplete();
1330     }
1331     }
1332     private static final long serialVersionUID = 5232453952276885070L;
1333     }
1334    
1335     // public methods
1336    
1337     /**
1338     * Creates a new incomplete CompletableFuture.
1339     */
1340     public CompletableFuture() {
1341     }
1342    
1343     /**
1344 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1345     * by a task running in the {@link ForkJoinPool#commonPool()} with
1346     * the value obtained by calling the given Supplier.
1347 dl 1.28 *
1348     * @param supplier a function returning the value to be used
1349     * to complete the returned CompletableFuture
1350 jsr166 1.58 * @return the new CompletableFuture
1351 dl 1.28 */
1352     public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier) {
1353     if (supplier == null) throw new NullPointerException();
1354     CompletableFuture<U> f = new CompletableFuture<U>();
1355     ForkJoinPool.commonPool().
1356     execute((ForkJoinTask<?>)new AsyncSupply<U>(supplier, f));
1357     return f;
1358     }
1359    
1360     /**
1361 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1362     * by a task running in the given executor with the value obtained
1363     * by calling the given Supplier.
1364 dl 1.28 *
1365     * @param supplier a function returning the value to be used
1366     * to complete the returned CompletableFuture
1367     * @param executor the executor to use for asynchronous execution
1368 jsr166 1.58 * @return the new CompletableFuture
1369 dl 1.28 */
1370     public static <U> CompletableFuture<U> supplyAsync(Supplier<U> supplier,
1371     Executor executor) {
1372     if (executor == null || supplier == null)
1373     throw new NullPointerException();
1374     CompletableFuture<U> f = new CompletableFuture<U>();
1375     executor.execute(new AsyncSupply<U>(supplier, f));
1376     return f;
1377     }
1378    
1379     /**
1380 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1381     * by a task running in the {@link ForkJoinPool#commonPool()} after
1382     * it runs the given action.
1383 dl 1.28 *
1384     * @param runnable the action to run before completing the
1385     * returned CompletableFuture
1386 jsr166 1.58 * @return the new CompletableFuture
1387 dl 1.28 */
1388     public static CompletableFuture<Void> runAsync(Runnable runnable) {
1389     if (runnable == null) throw new NullPointerException();
1390     CompletableFuture<Void> f = new CompletableFuture<Void>();
1391     ForkJoinPool.commonPool().
1392     execute((ForkJoinTask<?>)new AsyncRun(runnable, f));
1393     return f;
1394     }
1395    
1396     /**
1397 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1398     * by a task running in the given executor after it runs the given
1399     * action.
1400 dl 1.28 *
1401     * @param runnable the action to run before completing the
1402     * returned CompletableFuture
1403     * @param executor the executor to use for asynchronous execution
1404 jsr166 1.58 * @return the new CompletableFuture
1405 dl 1.28 */
1406     public static CompletableFuture<Void> runAsync(Runnable runnable,
1407     Executor executor) {
1408     if (executor == null || runnable == null)
1409     throw new NullPointerException();
1410     CompletableFuture<Void> f = new CompletableFuture<Void>();
1411     executor.execute(new AsyncRun(runnable, f));
1412     return f;
1413     }
1414    
1415     /**
1416     * Returns {@code true} if completed in any fashion: normally,
1417     * exceptionally, or via cancellation.
1418     *
1419     * @return {@code true} if completed
1420     */
1421     public boolean isDone() {
1422     return result != null;
1423     }
1424    
1425     /**
1426 dl 1.49 * Waits if necessary for this future to complete, and then
1427 dl 1.48 * returns its result.
1428 dl 1.28 *
1429 dl 1.48 * @return the result value
1430     * @throws CancellationException if this future was cancelled
1431     * @throws ExecutionException if this future completed exceptionally
1432 dl 1.28 * @throws InterruptedException if the current thread was interrupted
1433     * while waiting
1434     */
1435     public T get() throws InterruptedException, ExecutionException {
1436     Object r; Throwable ex, cause;
1437     if ((r = result) == null && (r = waitingGet(true)) == null)
1438     throw new InterruptedException();
1439 jsr166 1.45 if (!(r instanceof AltResult)) {
1440     @SuppressWarnings("unchecked") T tr = (T) r;
1441     return tr;
1442     }
1443     if ((ex = ((AltResult)r).ex) == null)
1444 dl 1.28 return null;
1445 jsr166 1.45 if (ex instanceof CancellationException)
1446     throw (CancellationException)ex;
1447     if ((ex instanceof CompletionException) &&
1448     (cause = ex.getCause()) != null)
1449     ex = cause;
1450     throw new ExecutionException(ex);
1451 dl 1.28 }
1452    
1453     /**
1454 dl 1.49 * Waits if necessary for at most the given time for this future
1455     * to complete, and then returns its result, if available.
1456 dl 1.28 *
1457     * @param timeout the maximum time to wait
1458     * @param unit the time unit of the timeout argument
1459 dl 1.48 * @return the result value
1460     * @throws CancellationException if this future was cancelled
1461     * @throws ExecutionException if this future completed exceptionally
1462 dl 1.28 * @throws InterruptedException if the current thread was interrupted
1463     * while waiting
1464     * @throws TimeoutException if the wait timed out
1465     */
1466     public T get(long timeout, TimeUnit unit)
1467     throws InterruptedException, ExecutionException, TimeoutException {
1468     Object r; Throwable ex, cause;
1469     long nanos = unit.toNanos(timeout);
1470     if (Thread.interrupted())
1471     throw new InterruptedException();
1472     if ((r = result) == null)
1473     r = timedAwaitDone(nanos);
1474 jsr166 1.45 if (!(r instanceof AltResult)) {
1475     @SuppressWarnings("unchecked") T tr = (T) r;
1476     return tr;
1477     }
1478     if ((ex = ((AltResult)r).ex) == null)
1479 dl 1.28 return null;
1480 jsr166 1.45 if (ex instanceof CancellationException)
1481     throw (CancellationException)ex;
1482     if ((ex instanceof CompletionException) &&
1483     (cause = ex.getCause()) != null)
1484     ex = cause;
1485     throw new ExecutionException(ex);
1486 dl 1.28 }
1487    
1488     /**
1489     * Returns the result value when complete, or throws an
1490     * (unchecked) exception if completed exceptionally. To better
1491     * conform with the use of common functional forms, if a
1492     * computation involved in the completion of this
1493     * CompletableFuture threw an exception, this method throws an
1494     * (unchecked) {@link CompletionException} with the underlying
1495     * exception as its cause.
1496     *
1497     * @return the result value
1498     * @throws CancellationException if the computation was cancelled
1499 jsr166 1.55 * @throws CompletionException if this future completed
1500     * exceptionally or a completion computation threw an exception
1501 dl 1.28 */
1502     public T join() {
1503     Object r; Throwable ex;
1504     if ((r = result) == null)
1505     r = waitingGet(false);
1506 jsr166 1.45 if (!(r instanceof AltResult)) {
1507     @SuppressWarnings("unchecked") T tr = (T) r;
1508     return tr;
1509     }
1510     if ((ex = ((AltResult)r).ex) == null)
1511 dl 1.28 return null;
1512 jsr166 1.45 if (ex instanceof CancellationException)
1513     throw (CancellationException)ex;
1514     if (ex instanceof CompletionException)
1515     throw (CompletionException)ex;
1516     throw new CompletionException(ex);
1517 dl 1.28 }
1518    
1519     /**
1520     * Returns the result value (or throws any encountered exception)
1521     * if completed, else returns the given valueIfAbsent.
1522     *
1523     * @param valueIfAbsent the value to return if not completed
1524     * @return the result value, if completed, else the given valueIfAbsent
1525     * @throws CancellationException if the computation was cancelled
1526 jsr166 1.55 * @throws CompletionException if this future completed
1527     * exceptionally or a completion computation threw an exception
1528 dl 1.28 */
1529     public T getNow(T valueIfAbsent) {
1530     Object r; Throwable ex;
1531     if ((r = result) == null)
1532     return valueIfAbsent;
1533 jsr166 1.45 if (!(r instanceof AltResult)) {
1534     @SuppressWarnings("unchecked") T tr = (T) r;
1535     return tr;
1536     }
1537     if ((ex = ((AltResult)r).ex) == null)
1538 dl 1.28 return null;
1539 jsr166 1.45 if (ex instanceof CancellationException)
1540     throw (CancellationException)ex;
1541     if (ex instanceof CompletionException)
1542     throw (CompletionException)ex;
1543     throw new CompletionException(ex);
1544 dl 1.28 }
1545    
1546     /**
1547     * If not already completed, sets the value returned by {@link
1548     * #get()} and related methods to the given value.
1549     *
1550     * @param value the result value
1551     * @return {@code true} if this invocation caused this CompletableFuture
1552     * to transition to a completed state, else {@code false}
1553     */
1554     public boolean complete(T value) {
1555     boolean triggered = result == null &&
1556     UNSAFE.compareAndSwapObject(this, RESULT, null,
1557     value == null ? NIL : value);
1558     postComplete();
1559     return triggered;
1560     }
1561    
1562     /**
1563     * If not already completed, causes invocations of {@link #get()}
1564     * and related methods to throw the given exception.
1565     *
1566     * @param ex the exception
1567     * @return {@code true} if this invocation caused this CompletableFuture
1568     * to transition to a completed state, else {@code false}
1569     */
1570     public boolean completeExceptionally(Throwable ex) {
1571     if (ex == null) throw new NullPointerException();
1572     boolean triggered = result == null &&
1573     UNSAFE.compareAndSwapObject(this, RESULT, null, new AltResult(ex));
1574     postComplete();
1575     return triggered;
1576     }
1577    
1578     /**
1579 jsr166 1.66 * Returns a new CompletableFuture that is completed
1580     * when this CompletableFuture completes, with the result of the
1581     * given function of this CompletableFuture's result.
1582     *
1583 dl 1.71 * <p>If this CompletableFuture completes exceptionally, or the
1584     * supplied function throws an unchecked exception, then the
1585     * returned CompletableFuture completes exceptionally with a
1586     * CompletionException holding the exception as its cause.
1587 dl 1.28 *
1588     * @param fn the function to use to compute the value of
1589     * the returned CompletableFuture
1590     * @return the new CompletableFuture
1591     */
1592     public <U> CompletableFuture<U> thenApply(Function<? super T,? extends U> fn) {
1593     return doThenApply(fn, null);
1594     }
1595    
1596     /**
1597 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1598     * when this CompletableFuture completes, with the result of the
1599 dl 1.71 * given function of this CompletableFuture's result from a
1600 jsr166 1.66 * task running in the {@link ForkJoinPool#commonPool()}.
1601     *
1602 dl 1.71 * <p>If this CompletableFuture completes exceptionally, or the
1603     * supplied function throws an unchecked exception, then the
1604     * returned CompletableFuture completes exceptionally with a
1605     * CompletionException holding the exception as its cause.
1606 dl 1.28 *
1607     * @param fn the function to use to compute the value of
1608     * the returned CompletableFuture
1609     * @return the new CompletableFuture
1610     */
1611 dl 1.48 public <U> CompletableFuture<U> thenApplyAsync
1612     (Function<? super T,? extends U> fn) {
1613 dl 1.28 return doThenApply(fn, ForkJoinPool.commonPool());
1614 dl 1.17 }
1615    
1616 dl 1.28 /**
1617 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1618     * when this CompletableFuture completes, with the result of the
1619 dl 1.71 * given function of this CompletableFuture's result from a
1620 jsr166 1.66 * task running in the given executor.
1621     *
1622 dl 1.71 * <p>If this CompletableFuture completes exceptionally, or the
1623     * supplied function throws an unchecked exception, then the
1624     * returned CompletableFuture completes exceptionally with a
1625     * CompletionException holding the exception as its cause.
1626 dl 1.28 *
1627     * @param fn the function to use to compute the value of
1628     * the returned CompletableFuture
1629     * @param executor the executor to use for asynchronous execution
1630     * @return the new CompletableFuture
1631     */
1632 dl 1.48 public <U> CompletableFuture<U> thenApplyAsync
1633     (Function<? super T,? extends U> fn,
1634     Executor executor) {
1635 dl 1.28 if (executor == null) throw new NullPointerException();
1636     return doThenApply(fn, executor);
1637     }
1638 dl 1.1
1639 dl 1.48 private <U> CompletableFuture<U> doThenApply
1640     (Function<? super T,? extends U> fn,
1641     Executor e) {
1642 dl 1.1 if (fn == null) throw new NullPointerException();
1643     CompletableFuture<U> dst = new CompletableFuture<U>();
1644 dl 1.28 ApplyCompletion<T,U> d = null;
1645 jsr166 1.2 Object r;
1646     if ((r = result) == null) {
1647 dl 1.1 CompletionNode p = new CompletionNode
1648 dl 1.28 (d = new ApplyCompletion<T,U>(this, fn, dst, e));
1649 dl 1.1 while ((r = result) == null) {
1650     if (UNSAFE.compareAndSwapObject
1651     (this, COMPLETIONS, p.next = completions, p))
1652     break;
1653     }
1654     }
1655 jsr166 1.2 if (r != null && (d == null || d.compareAndSet(0, 1))) {
1656 dl 1.19 T t; Throwable ex;
1657 jsr166 1.2 if (r instanceof AltResult) {
1658 dl 1.19 ex = ((AltResult)r).ex;
1659 jsr166 1.2 t = null;
1660 dl 1.1 }
1661 dl 1.19 else {
1662     ex = null;
1663 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
1664     t = tr;
1665 dl 1.19 }
1666 dl 1.20 U u = null;
1667 jsr166 1.2 if (ex == null) {
1668 dl 1.1 try {
1669 dl 1.20 if (e != null)
1670 dl 1.28 e.execute(new AsyncApply<T,U>(t, fn, dst));
1671 dl 1.1 else
1672 dl 1.20 u = fn.apply(t);
1673 dl 1.1 } catch (Throwable rex) {
1674 dl 1.19 ex = rex;
1675 dl 1.1 }
1676     }
1677 dl 1.20 if (e == null || ex != null)
1678     dst.internalComplete(u, ex);
1679 dl 1.17 }
1680 dl 1.20 helpPostComplete();
1681 dl 1.1 return dst;
1682     }
1683    
1684 dl 1.28 /**
1685 jsr166 1.66 * Returns a new CompletableFuture that is completed
1686     * when this CompletableFuture completes, after performing the given
1687     * action with this CompletableFuture's result.
1688     *
1689 dl 1.71 * <p>If this CompletableFuture completes exceptionally, or the
1690     * supplied function throws an unchecked exception, then the
1691     * returned CompletableFuture completes exceptionally with a
1692     * CompletionException holding the exception as its cause.
1693 dl 1.28 *
1694     * @param block the action to perform before completing the
1695     * returned CompletableFuture
1696     * @return the new CompletableFuture
1697     */
1698 dl 1.34 public CompletableFuture<Void> thenAccept(Consumer<? super T> block) {
1699 dl 1.28 return doThenAccept(block, null);
1700     }
1701    
1702     /**
1703 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1704     * when this CompletableFuture completes, after performing the given
1705     * action with this CompletableFuture's result from a task running
1706     * in the {@link ForkJoinPool#commonPool()}.
1707     *
1708 dl 1.71 * <p>If this CompletableFuture completes exceptionally, or the
1709     * supplied function throws an unchecked exception, then the
1710     * returned CompletableFuture completes exceptionally with a
1711     * CompletionException holding the exception as its cause.
1712 dl 1.28 *
1713     * @param block the action to perform before completing the
1714     * returned CompletableFuture
1715     * @return the new CompletableFuture
1716     */
1717 dl 1.34 public CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> block) {
1718 dl 1.28 return doThenAccept(block, ForkJoinPool.commonPool());
1719     }
1720    
1721     /**
1722 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1723     * when this CompletableFuture completes, after performing the given
1724     * action with this CompletableFuture's result from a task running
1725     * in the given executor.
1726     *
1727 dl 1.71 * <p>If this CompletableFuture completes exceptionally, or the
1728     * supplied function throws an unchecked exception, then the
1729     * returned CompletableFuture completes exceptionally with a
1730     * CompletionException holding the exception as its cause.
1731 dl 1.28 *
1732     * @param block the action to perform before completing the
1733     * returned CompletableFuture
1734     * @param executor the executor to use for asynchronous execution
1735     * @return the new CompletableFuture
1736     */
1737 dl 1.34 public CompletableFuture<Void> thenAcceptAsync(Consumer<? super T> block,
1738 dl 1.28 Executor executor) {
1739     if (executor == null) throw new NullPointerException();
1740     return doThenAccept(block, executor);
1741     }
1742    
1743 dl 1.34 private CompletableFuture<Void> doThenAccept(Consumer<? super T> fn,
1744 dl 1.28 Executor e) {
1745 dl 1.7 if (fn == null) throw new NullPointerException();
1746     CompletableFuture<Void> dst = new CompletableFuture<Void>();
1747 dl 1.28 AcceptCompletion<T> d = null;
1748 dl 1.7 Object r;
1749     if ((r = result) == null) {
1750     CompletionNode p = new CompletionNode
1751 dl 1.28 (d = new AcceptCompletion<T>(this, fn, dst, e));
1752 dl 1.7 while ((r = result) == null) {
1753     if (UNSAFE.compareAndSwapObject
1754     (this, COMPLETIONS, p.next = completions, p))
1755     break;
1756     }
1757     }
1758     if (r != null && (d == null || d.compareAndSet(0, 1))) {
1759 dl 1.19 T t; Throwable ex;
1760 dl 1.7 if (r instanceof AltResult) {
1761 dl 1.19 ex = ((AltResult)r).ex;
1762 dl 1.7 t = null;
1763     }
1764 dl 1.19 else {
1765     ex = null;
1766 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
1767     t = tr;
1768 dl 1.19 }
1769 dl 1.7 if (ex == null) {
1770     try {
1771 dl 1.20 if (e != null)
1772 dl 1.28 e.execute(new AsyncAccept<T>(t, fn, dst));
1773 dl 1.20 else
1774 dl 1.7 fn.accept(t);
1775     } catch (Throwable rex) {
1776 dl 1.19 ex = rex;
1777 dl 1.7 }
1778     }
1779 dl 1.20 if (e == null || ex != null)
1780     dst.internalComplete(null, ex);
1781 dl 1.17 }
1782 dl 1.20 helpPostComplete();
1783 dl 1.7 return dst;
1784     }
1785    
1786 dl 1.28 /**
1787 jsr166 1.66 * Returns a new CompletableFuture that is completed
1788     * when this CompletableFuture completes, after performing the given
1789     * action.
1790     *
1791 dl 1.71 * <p>If this CompletableFuture completes exceptionally, or the
1792     * supplied function throws an unchecked exception, then the
1793     * returned CompletableFuture completes exceptionally with a
1794     * CompletionException holding the exception as its cause.
1795 dl 1.28 *
1796     * @param action the action to perform before completing the
1797     * returned CompletableFuture
1798     * @return the new CompletableFuture
1799     */
1800     public CompletableFuture<Void> thenRun(Runnable action) {
1801     return doThenRun(action, null);
1802     }
1803    
1804     /**
1805 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1806     * when this CompletableFuture completes, after performing the given
1807     * action from a task running in the {@link ForkJoinPool#commonPool()}.
1808     *
1809 dl 1.71 * <p>If this CompletableFuture completes exceptionally, or the
1810     * supplied function throws an unchecked exception, then the
1811     * returned CompletableFuture completes exceptionally with a
1812     * CompletionException holding the exception as its cause.
1813 dl 1.28 *
1814     * @param action the action to perform before completing the
1815     * returned CompletableFuture
1816     * @return the new CompletableFuture
1817     */
1818     public CompletableFuture<Void> thenRunAsync(Runnable action) {
1819     return doThenRun(action, ForkJoinPool.commonPool());
1820     }
1821    
1822     /**
1823 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1824     * when this CompletableFuture completes, after performing the given
1825     * action from a task running in the given executor.
1826     *
1827 dl 1.71 * <p>If this CompletableFuture completes exceptionally, or the
1828     * supplied function throws an unchecked exception, then the
1829     * returned CompletableFuture completes exceptionally with a
1830     * CompletionException holding the exception as its cause.
1831 dl 1.28 *
1832     * @param action the action to perform before completing the
1833     * returned CompletableFuture
1834     * @param executor the executor to use for asynchronous execution
1835     * @return the new CompletableFuture
1836     */
1837     public CompletableFuture<Void> thenRunAsync(Runnable action,
1838     Executor executor) {
1839     if (executor == null) throw new NullPointerException();
1840     return doThenRun(action, executor);
1841     }
1842    
1843     private CompletableFuture<Void> doThenRun(Runnable action,
1844     Executor e) {
1845 dl 1.1 if (action == null) throw new NullPointerException();
1846     CompletableFuture<Void> dst = new CompletableFuture<Void>();
1847 dl 1.28 RunCompletion<T> d = null;
1848 jsr166 1.2 Object r;
1849     if ((r = result) == null) {
1850 dl 1.1 CompletionNode p = new CompletionNode
1851 dl 1.28 (d = new RunCompletion<T>(this, action, dst, e));
1852 dl 1.1 while ((r = result) == null) {
1853     if (UNSAFE.compareAndSwapObject
1854     (this, COMPLETIONS, p.next = completions, p))
1855     break;
1856     }
1857     }
1858 jsr166 1.2 if (r != null && (d == null || d.compareAndSet(0, 1))) {
1859 dl 1.19 Throwable ex;
1860     if (r instanceof AltResult)
1861 dl 1.28 ex = ((AltResult)r).ex;
1862     else
1863     ex = null;
1864     if (ex == null) {
1865     try {
1866     if (e != null)
1867     e.execute(new AsyncRun(action, dst));
1868     else
1869     action.run();
1870     } catch (Throwable rex) {
1871     ex = rex;
1872     }
1873     }
1874     if (e == null || ex != null)
1875     dst.internalComplete(null, ex);
1876     }
1877     helpPostComplete();
1878     return dst;
1879     }
1880    
1881     /**
1882 jsr166 1.66 * Returns a new CompletableFuture that is completed
1883     * when both this and the other given CompletableFuture complete,
1884     * with the result of the given function of the results of the two
1885     * CompletableFutures.
1886     *
1887 dl 1.71 * <p>If this and/or the other CompletableFuture complete
1888     * exceptionally, or the supplied function throws an unchecked
1889     * exception, then the returned CompletableFuture completes
1890     * exceptionally with a CompletionException holding the exception
1891     * as its cause.
1892    
1893 jsr166 1.66 * then the returned CompletableFuture also does so, with a
1894 dl 1.28 * CompletionException holding the exception as its cause.
1895     *
1896     * @param other the other CompletableFuture
1897     * @param fn the function to use to compute the value of
1898     * the returned CompletableFuture
1899     * @return the new CompletableFuture
1900     */
1901 dl 1.48 public <U,V> CompletableFuture<V> thenCombine
1902     (CompletableFuture<? extends U> other,
1903     BiFunction<? super T,? super U,? extends V> fn) {
1904 dl 1.28 return doThenBiApply(other, fn, null);
1905     }
1906    
1907     /**
1908 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1909     * when both this and the other given CompletableFuture complete,
1910     * with the result of the given function of the results of the two
1911 dl 1.71 * CompletableFutures from a task running in the
1912 jsr166 1.66 * {@link ForkJoinPool#commonPool()}.
1913     *
1914 dl 1.71 * <p>If this and/or the other CompletableFuture complete
1915     * exceptionally, or the supplied function throws an unchecked
1916     * exception, then the returned CompletableFuture completes
1917     * exceptionally with a CompletionException holding the exception
1918     * as its cause.
1919 dl 1.28 *
1920     * @param other the other CompletableFuture
1921     * @param fn the function to use to compute the value of
1922     * the returned CompletableFuture
1923     * @return the new CompletableFuture
1924     */
1925 dl 1.48 public <U,V> CompletableFuture<V> thenCombineAsync
1926     (CompletableFuture<? extends U> other,
1927     BiFunction<? super T,? super U,? extends V> fn) {
1928 dl 1.28 return doThenBiApply(other, fn, ForkJoinPool.commonPool());
1929     }
1930    
1931     /**
1932 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
1933     * when both this and the other given CompletableFuture complete,
1934     * with the result of the given function of the results of the two
1935 dl 1.71 * CompletableFutures from a task running in the given executor.
1936 jsr166 1.66 *
1937 dl 1.71 * <p>If this and/or the other CompletableFuture complete
1938     * exceptionally, or the supplied function throws an unchecked
1939     * exception, then the returned CompletableFuture completes
1940     * exceptionally with a CompletionException holding the exception
1941     * as its cause.
1942 dl 1.28 *
1943     * @param other the other CompletableFuture
1944     * @param fn the function to use to compute the value of
1945     * the returned CompletableFuture
1946     * @param executor the executor to use for asynchronous execution
1947     * @return the new CompletableFuture
1948     */
1949 dl 1.48 public <U,V> CompletableFuture<V> thenCombineAsync
1950     (CompletableFuture<? extends U> other,
1951     BiFunction<? super T,? super U,? extends V> fn,
1952     Executor executor) {
1953 dl 1.28 if (executor == null) throw new NullPointerException();
1954     return doThenBiApply(other, fn, executor);
1955 dl 1.1 }
1956    
1957 dl 1.48 private <U,V> CompletableFuture<V> doThenBiApply
1958     (CompletableFuture<? extends U> other,
1959     BiFunction<? super T,? super U,? extends V> fn,
1960     Executor e) {
1961 dl 1.1 if (other == null || fn == null) throw new NullPointerException();
1962 jsr166 1.2 CompletableFuture<V> dst = new CompletableFuture<V>();
1963 dl 1.28 BiApplyCompletion<T,U,V> d = null;
1964 jsr166 1.2 Object r, s = null;
1965     if ((r = result) == null || (s = other.result) == null) {
1966 dl 1.28 d = new BiApplyCompletion<T,U,V>(this, other, fn, dst, e);
1967 dl 1.1 CompletionNode q = null, p = new CompletionNode(d);
1968     while ((r == null && (r = result) == null) ||
1969     (s == null && (s = other.result) == null)) {
1970     if (q != null) {
1971     if (s != null ||
1972     UNSAFE.compareAndSwapObject
1973     (other, COMPLETIONS, q.next = other.completions, q))
1974     break;
1975     }
1976     else if (r != null ||
1977     UNSAFE.compareAndSwapObject
1978     (this, COMPLETIONS, p.next = completions, p)) {
1979     if (s != null)
1980     break;
1981     q = new CompletionNode(d);
1982     }
1983     }
1984     }
1985 jsr166 1.2 if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) {
1986 dl 1.19 T t; U u; Throwable ex;
1987 jsr166 1.2 if (r instanceof AltResult) {
1988 dl 1.19 ex = ((AltResult)r).ex;
1989 jsr166 1.2 t = null;
1990 dl 1.1 }
1991 dl 1.19 else {
1992     ex = null;
1993 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
1994     t = tr;
1995 dl 1.19 }
1996 dl 1.1 if (ex != null)
1997     u = null;
1998     else if (s instanceof AltResult) {
1999 dl 1.19 ex = ((AltResult)s).ex;
2000 dl 1.1 u = null;
2001     }
2002 dl 1.28 else {
2003     @SuppressWarnings("unchecked") U us = (U) s;
2004     u = us;
2005     }
2006 dl 1.20 V v = null;
2007 jsr166 1.2 if (ex == null) {
2008 dl 1.1 try {
2009 dl 1.20 if (e != null)
2010 dl 1.28 e.execute(new AsyncBiApply<T,U,V>(t, u, fn, dst));
2011 dl 1.1 else
2012 dl 1.20 v = fn.apply(t, u);
2013 dl 1.1 } catch (Throwable rex) {
2014 dl 1.19 ex = rex;
2015 dl 1.1 }
2016     }
2017 dl 1.20 if (e == null || ex != null)
2018     dst.internalComplete(v, ex);
2019 jsr166 1.2 }
2020 dl 1.20 helpPostComplete();
2021     other.helpPostComplete();
2022 jsr166 1.2 return dst;
2023 dl 1.1 }
2024    
2025 dl 1.28 /**
2026 jsr166 1.66 * Returns a new CompletableFuture that is completed
2027     * when both this and the other given CompletableFuture complete,
2028     * after performing the given action with the results of the two
2029     * CompletableFutures.
2030     *
2031 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2032     * exceptionally, or the supplied action throws an unchecked
2033     * exception, then the returned CompletableFuture completes
2034     * exceptionally with a CompletionException holding the exception
2035     * as its cause.
2036 dl 1.28 *
2037     * @param other the other CompletableFuture
2038     * @param block the action to perform before completing the
2039     * returned CompletableFuture
2040     * @return the new CompletableFuture
2041     */
2042 dl 1.48 public <U> CompletableFuture<Void> thenAcceptBoth
2043     (CompletableFuture<? extends U> other,
2044     BiConsumer<? super T, ? super U> block) {
2045 dl 1.28 return doThenBiAccept(other, block, null);
2046     }
2047    
2048     /**
2049 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
2050     * when both this and the other given CompletableFuture complete,
2051     * after performing the given action with the results of the two
2052     * CompletableFutures from a task running in the {@link
2053     * ForkJoinPool#commonPool()}.
2054     *
2055 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2056     * exceptionally, or the supplied action throws an unchecked
2057     * exception, then the returned CompletableFuture completes
2058     * exceptionally with a CompletionException holding the exception
2059     * as its cause.
2060 dl 1.28 *
2061     * @param other the other CompletableFuture
2062     * @param block the action to perform before completing the
2063     * returned CompletableFuture
2064     * @return the new CompletableFuture
2065     */
2066 dl 1.48 public <U> CompletableFuture<Void> thenAcceptBothAsync
2067     (CompletableFuture<? extends U> other,
2068     BiConsumer<? super T, ? super U> block) {
2069 dl 1.28 return doThenBiAccept(other, block, ForkJoinPool.commonPool());
2070     }
2071    
2072     /**
2073 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
2074     * when both this and the other given CompletableFuture complete,
2075     * after performing the given action with the results of the two
2076     * CompletableFutures from a task running in the given executor.
2077     *
2078 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2079     * exceptionally, or the supplied action throws an unchecked
2080     * exception, then the returned CompletableFuture completes
2081     * exceptionally with a CompletionException holding the exception
2082     * as its cause.
2083 dl 1.28 *
2084     * @param other the other CompletableFuture
2085     * @param block the action to perform before completing the
2086     * returned CompletableFuture
2087     * @param executor the executor to use for asynchronous execution
2088     * @return the new CompletableFuture
2089     */
2090 dl 1.48 public <U> CompletableFuture<Void> thenAcceptBothAsync
2091     (CompletableFuture<? extends U> other,
2092     BiConsumer<? super T, ? super U> block,
2093     Executor executor) {
2094 dl 1.28 if (executor == null) throw new NullPointerException();
2095     return doThenBiAccept(other, block, executor);
2096     }
2097    
2098 dl 1.48 private <U> CompletableFuture<Void> doThenBiAccept
2099     (CompletableFuture<? extends U> other,
2100     BiConsumer<? super T,? super U> fn,
2101     Executor e) {
2102 dl 1.7 if (other == null || fn == null) throw new NullPointerException();
2103     CompletableFuture<Void> dst = new CompletableFuture<Void>();
2104 dl 1.28 BiAcceptCompletion<T,U> d = null;
2105 dl 1.7 Object r, s = null;
2106     if ((r = result) == null || (s = other.result) == null) {
2107 dl 1.28 d = new BiAcceptCompletion<T,U>(this, other, fn, dst, e);
2108 dl 1.7 CompletionNode q = null, p = new CompletionNode(d);
2109     while ((r == null && (r = result) == null) ||
2110     (s == null && (s = other.result) == null)) {
2111     if (q != null) {
2112     if (s != null ||
2113     UNSAFE.compareAndSwapObject
2114     (other, COMPLETIONS, q.next = other.completions, q))
2115     break;
2116     }
2117     else if (r != null ||
2118     UNSAFE.compareAndSwapObject
2119     (this, COMPLETIONS, p.next = completions, p)) {
2120     if (s != null)
2121     break;
2122     q = new CompletionNode(d);
2123     }
2124     }
2125     }
2126     if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) {
2127 dl 1.19 T t; U u; Throwable ex;
2128 dl 1.7 if (r instanceof AltResult) {
2129 dl 1.19 ex = ((AltResult)r).ex;
2130 dl 1.7 t = null;
2131     }
2132 dl 1.19 else {
2133     ex = null;
2134 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
2135     t = tr;
2136 dl 1.19 }
2137 dl 1.7 if (ex != null)
2138     u = null;
2139     else if (s instanceof AltResult) {
2140 dl 1.19 ex = ((AltResult)s).ex;
2141 dl 1.7 u = null;
2142     }
2143 dl 1.28 else {
2144     @SuppressWarnings("unchecked") U us = (U) s;
2145     u = us;
2146     }
2147 dl 1.7 if (ex == null) {
2148     try {
2149 dl 1.20 if (e != null)
2150 dl 1.28 e.execute(new AsyncBiAccept<T,U>(t, u, fn, dst));
2151 dl 1.20 else
2152 dl 1.7 fn.accept(t, u);
2153     } catch (Throwable rex) {
2154 dl 1.19 ex = rex;
2155 dl 1.7 }
2156     }
2157 dl 1.20 if (e == null || ex != null)
2158     dst.internalComplete(null, ex);
2159 dl 1.7 }
2160 dl 1.20 helpPostComplete();
2161     other.helpPostComplete();
2162 dl 1.7 return dst;
2163     }
2164    
2165 dl 1.28 /**
2166 jsr166 1.66 * Returns a new CompletableFuture that is completed
2167     * when both this and the other given CompletableFuture complete,
2168     * after performing the given action.
2169     *
2170 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2171     * exceptionally, or the supplied action throws an unchecked
2172     * exception, then the returned CompletableFuture completes
2173     * exceptionally with a CompletionException holding the exception
2174     * as its cause.
2175 dl 1.28 *
2176     * @param other the other CompletableFuture
2177     * @param action the action to perform before completing the
2178     * returned CompletableFuture
2179     * @return the new CompletableFuture
2180     */
2181     public CompletableFuture<Void> runAfterBoth(CompletableFuture<?> other,
2182     Runnable action) {
2183     return doThenBiRun(other, action, null);
2184     }
2185    
2186     /**
2187 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
2188     * when both this and the other given CompletableFuture complete,
2189     * after performing the given action from a task running in the
2190     * {@link ForkJoinPool#commonPool()}.
2191     *
2192 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2193     * exceptionally, or the supplied action throws an unchecked
2194     * exception, then the returned CompletableFuture completes
2195     * exceptionally with a CompletionException holding the exception
2196     * as its cause.
2197 dl 1.28 *
2198     * @param other the other CompletableFuture
2199     * @param action the action to perform before completing the
2200     * returned CompletableFuture
2201     * @return the new CompletableFuture
2202     */
2203     public CompletableFuture<Void> runAfterBothAsync(CompletableFuture<?> other,
2204     Runnable action) {
2205     return doThenBiRun(other, action, ForkJoinPool.commonPool());
2206     }
2207    
2208     /**
2209 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
2210     * when both this and the other given CompletableFuture complete,
2211     * after performing the given action from a task running in the
2212     * given executor.
2213     *
2214 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2215     * exceptionally, or the supplied action throws an unchecked
2216     * exception, then the returned CompletableFuture completes
2217     * exceptionally with a CompletionException holding the exception
2218     * as its cause.
2219 dl 1.28 *
2220     * @param other the other CompletableFuture
2221     * @param action the action to perform before completing the
2222     * returned CompletableFuture
2223     * @param executor the executor to use for asynchronous execution
2224     * @return the new CompletableFuture
2225     */
2226     public CompletableFuture<Void> runAfterBothAsync(CompletableFuture<?> other,
2227     Runnable action,
2228     Executor executor) {
2229     if (executor == null) throw new NullPointerException();
2230     return doThenBiRun(other, action, executor);
2231     }
2232    
2233     private CompletableFuture<Void> doThenBiRun(CompletableFuture<?> other,
2234     Runnable action,
2235     Executor e) {
2236 dl 1.1 if (other == null || action == null) throw new NullPointerException();
2237 jsr166 1.2 CompletableFuture<Void> dst = new CompletableFuture<Void>();
2238 dl 1.28 BiRunCompletion<T> d = null;
2239 jsr166 1.2 Object r, s = null;
2240     if ((r = result) == null || (s = other.result) == null) {
2241 dl 1.28 d = new BiRunCompletion<T>(this, other, action, dst, e);
2242 dl 1.1 CompletionNode q = null, p = new CompletionNode(d);
2243     while ((r == null && (r = result) == null) ||
2244     (s == null && (s = other.result) == null)) {
2245     if (q != null) {
2246     if (s != null ||
2247     UNSAFE.compareAndSwapObject
2248     (other, COMPLETIONS, q.next = other.completions, q))
2249     break;
2250     }
2251     else if (r != null ||
2252     UNSAFE.compareAndSwapObject
2253     (this, COMPLETIONS, p.next = completions, p)) {
2254     if (s != null)
2255     break;
2256     q = new CompletionNode(d);
2257     }
2258     }
2259     }
2260 jsr166 1.2 if (r != null && s != null && (d == null || d.compareAndSet(0, 1))) {
2261 dl 1.19 Throwable ex;
2262     if (r instanceof AltResult)
2263     ex = ((AltResult)r).ex;
2264     else
2265     ex = null;
2266     if (ex == null && (s instanceof AltResult))
2267     ex = ((AltResult)s).ex;
2268     if (ex == null) {
2269 dl 1.1 try {
2270 dl 1.20 if (e != null)
2271 dl 1.28 e.execute(new AsyncRun(action, dst));
2272 dl 1.20 else
2273 dl 1.1 action.run();
2274     } catch (Throwable rex) {
2275 dl 1.19 ex = rex;
2276 dl 1.1 }
2277     }
2278 dl 1.20 if (e == null || ex != null)
2279     dst.internalComplete(null, ex);
2280 jsr166 1.2 }
2281 dl 1.20 helpPostComplete();
2282     other.helpPostComplete();
2283 jsr166 1.2 return dst;
2284 dl 1.1 }
2285    
2286 dl 1.28 /**
2287 jsr166 1.66 * Returns a new CompletableFuture that is completed
2288     * when either this or the other given CompletableFuture completes,
2289     * with the result of the given function of either this or the other
2290     * CompletableFuture's result.
2291     *
2292 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2293     * exceptionally, exceptionally, or the supplied function throws
2294     * an unchecked exception, then the returned CompletableFuture may
2295     * also do so, with a CompletionException holding one of these
2296     * exceptions as its cause. No guarantees are made about which
2297     * result or exception is used in the returned CompletableFuture.
2298 dl 1.28 *
2299     * @param other the other CompletableFuture
2300     * @param fn the function to use to compute the value of
2301     * the returned CompletableFuture
2302     * @return the new CompletableFuture
2303     */
2304 dl 1.48 public <U> CompletableFuture<U> applyToEither
2305     (CompletableFuture<? extends T> other,
2306     Function<? super T, U> fn) {
2307 dl 1.28 return doOrApply(other, fn, null);
2308     }
2309    
2310     /**
2311 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
2312     * when either this or the other given CompletableFuture completes,
2313     * with the result of the given function of either this or the other
2314 dl 1.71 * CompletableFuture's result from a task running in the
2315 jsr166 1.66 * {@link ForkJoinPool#commonPool()}.
2316     *
2317 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2318     * exceptionally, exceptionally, or the supplied function throws
2319     * an unchecked exception, then the returned CompletableFuture may
2320     * also do so, with a CompletionException holding one of these
2321     * exceptions as its cause. No guarantees are made about which
2322     * result or exception is used in the returned CompletableFuture.
2323 dl 1.28 *
2324     * @param other the other CompletableFuture
2325     * @param fn the function to use to compute the value of
2326     * the returned CompletableFuture
2327     * @return the new CompletableFuture
2328     */
2329 dl 1.48 public <U> CompletableFuture<U> applyToEitherAsync
2330     (CompletableFuture<? extends T> other,
2331     Function<? super T, U> fn) {
2332 dl 1.28 return doOrApply(other, fn, ForkJoinPool.commonPool());
2333     }
2334    
2335     /**
2336 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
2337     * when either this or the other given CompletableFuture completes,
2338     * with the result of the given function of either this or the other
2339 dl 1.71 * CompletableFuture's result from a task running in the
2340 jsr166 1.66 * given executor.
2341     *
2342 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2343     * exceptionally, exceptionally, or the supplied function throws
2344     * an unchecked exception, then the returned CompletableFuture may
2345     * also do so, with a CompletionException holding one of these
2346     * exceptions as its cause. No guarantees are made about which
2347     * result or exception is used in the returned CompletableFuture.
2348 dl 1.28 *
2349     * @param other the other CompletableFuture
2350     * @param fn the function to use to compute the value of
2351     * the returned CompletableFuture
2352     * @param executor the executor to use for asynchronous execution
2353     * @return the new CompletableFuture
2354     */
2355 dl 1.48 public <U> CompletableFuture<U> applyToEitherAsync
2356     (CompletableFuture<? extends T> other,
2357     Function<? super T, U> fn,
2358     Executor executor) {
2359 dl 1.28 if (executor == null) throw new NullPointerException();
2360     return doOrApply(other, fn, executor);
2361     }
2362    
2363 dl 1.48 private <U> CompletableFuture<U> doOrApply
2364     (CompletableFuture<? extends T> other,
2365     Function<? super T, U> fn,
2366     Executor e) {
2367 dl 1.1 if (other == null || fn == null) throw new NullPointerException();
2368 jsr166 1.2 CompletableFuture<U> dst = new CompletableFuture<U>();
2369 dl 1.28 OrApplyCompletion<T,U> d = null;
2370 jsr166 1.2 Object r;
2371     if ((r = result) == null && (r = other.result) == null) {
2372 dl 1.28 d = new OrApplyCompletion<T,U>(this, other, fn, dst, e);
2373 dl 1.1 CompletionNode q = null, p = new CompletionNode(d);
2374     while ((r = result) == null && (r = other.result) == null) {
2375     if (q != null) {
2376     if (UNSAFE.compareAndSwapObject
2377     (other, COMPLETIONS, q.next = other.completions, q))
2378     break;
2379     }
2380     else if (UNSAFE.compareAndSwapObject
2381     (this, COMPLETIONS, p.next = completions, p))
2382     q = new CompletionNode(d);
2383     }
2384 jsr166 1.2 }
2385     if (r != null && (d == null || d.compareAndSet(0, 1))) {
2386 dl 1.19 T t; Throwable ex;
2387 jsr166 1.2 if (r instanceof AltResult) {
2388 dl 1.19 ex = ((AltResult)r).ex;
2389 jsr166 1.2 t = null;
2390 dl 1.1 }
2391 dl 1.19 else {
2392     ex = null;
2393 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
2394     t = tr;
2395 dl 1.19 }
2396 dl 1.20 U u = null;
2397 jsr166 1.2 if (ex == null) {
2398 dl 1.1 try {
2399 dl 1.20 if (e != null)
2400 dl 1.28 e.execute(new AsyncApply<T,U>(t, fn, dst));
2401 dl 1.1 else
2402 dl 1.20 u = fn.apply(t);
2403 dl 1.1 } catch (Throwable rex) {
2404 dl 1.19 ex = rex;
2405 dl 1.1 }
2406     }
2407 dl 1.20 if (e == null || ex != null)
2408     dst.internalComplete(u, ex);
2409 jsr166 1.2 }
2410 dl 1.20 helpPostComplete();
2411     other.helpPostComplete();
2412 jsr166 1.2 return dst;
2413 dl 1.1 }
2414    
2415 dl 1.28 /**
2416 jsr166 1.66 * Returns a new CompletableFuture that is completed
2417     * when either this or the other given CompletableFuture completes,
2418     * after performing the given action with the result of either this
2419     * or the other CompletableFuture's result.
2420     *
2421 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2422     * exceptionally, exceptionally, or the supplied action throws
2423     * an unchecked exception, then the returned CompletableFuture may
2424     * also do so, with a CompletionException holding one of these
2425     * exceptions as its cause. No guarantees are made about which
2426     * result or exception is used in the returned CompletableFuture.
2427 dl 1.28 *
2428     * @param other the other CompletableFuture
2429     * @param block the action to perform before completing the
2430     * returned CompletableFuture
2431     * @return the new CompletableFuture
2432     */
2433 dl 1.48 public CompletableFuture<Void> acceptEither
2434     (CompletableFuture<? extends T> other,
2435     Consumer<? super T> block) {
2436 dl 1.28 return doOrAccept(other, block, null);
2437     }
2438    
2439     /**
2440 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
2441     * when either this or the other given CompletableFuture completes,
2442     * after performing the given action with the result of either this
2443     * or the other CompletableFuture's result from a task running in
2444     * the {@link ForkJoinPool#commonPool()}.
2445     *
2446 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2447     * exceptionally, exceptionally, or the supplied action throws
2448     * an unchecked exception, then the returned CompletableFuture may
2449     * also do so, with a CompletionException holding one of these
2450     * exceptions as its cause. No guarantees are made about which
2451     * result or exception is used in the returned CompletableFuture.
2452 dl 1.28 *
2453     * @param other the other CompletableFuture
2454     * @param block the action to perform before completing the
2455     * returned CompletableFuture
2456     * @return the new CompletableFuture
2457     */
2458 dl 1.48 public CompletableFuture<Void> acceptEitherAsync
2459     (CompletableFuture<? extends T> other,
2460     Consumer<? super T> block) {
2461 dl 1.28 return doOrAccept(other, block, ForkJoinPool.commonPool());
2462     }
2463    
2464     /**
2465 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
2466     * when either this or the other given CompletableFuture completes,
2467     * after performing the given action with the result of either this
2468     * or the other CompletableFuture's result from a task running in
2469     * the given executor.
2470     *
2471 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2472     * exceptionally, exceptionally, or the supplied action throws
2473     * an unchecked exception, then the returned CompletableFuture may
2474     * also do so, with a CompletionException holding one of these
2475     * exceptions as its cause. No guarantees are made about which
2476     * result or exception is used in the returned CompletableFuture.
2477 dl 1.28 *
2478     * @param other the other CompletableFuture
2479     * @param block the action to perform before completing the
2480     * returned CompletableFuture
2481     * @param executor the executor to use for asynchronous execution
2482     * @return the new CompletableFuture
2483     */
2484 dl 1.48 public CompletableFuture<Void> acceptEitherAsync
2485     (CompletableFuture<? extends T> other,
2486     Consumer<? super T> block,
2487     Executor executor) {
2488 dl 1.28 if (executor == null) throw new NullPointerException();
2489     return doOrAccept(other, block, executor);
2490     }
2491    
2492 dl 1.48 private CompletableFuture<Void> doOrAccept
2493     (CompletableFuture<? extends T> other,
2494     Consumer<? super T> fn,
2495     Executor e) {
2496 dl 1.7 if (other == null || fn == null) throw new NullPointerException();
2497     CompletableFuture<Void> dst = new CompletableFuture<Void>();
2498 dl 1.28 OrAcceptCompletion<T> d = null;
2499 dl 1.7 Object r;
2500     if ((r = result) == null && (r = other.result) == null) {
2501 dl 1.28 d = new OrAcceptCompletion<T>(this, other, fn, dst, e);
2502 dl 1.7 CompletionNode q = null, p = new CompletionNode(d);
2503     while ((r = result) == null && (r = other.result) == null) {
2504     if (q != null) {
2505     if (UNSAFE.compareAndSwapObject
2506     (other, COMPLETIONS, q.next = other.completions, q))
2507     break;
2508     }
2509     else if (UNSAFE.compareAndSwapObject
2510     (this, COMPLETIONS, p.next = completions, p))
2511     q = new CompletionNode(d);
2512     }
2513     }
2514     if (r != null && (d == null || d.compareAndSet(0, 1))) {
2515 dl 1.19 T t; Throwable ex;
2516 dl 1.7 if (r instanceof AltResult) {
2517 dl 1.19 ex = ((AltResult)r).ex;
2518 dl 1.7 t = null;
2519     }
2520 dl 1.19 else {
2521     ex = null;
2522 dl 1.28 @SuppressWarnings("unchecked") T tr = (T) r;
2523     t = tr;
2524 dl 1.19 }
2525 dl 1.7 if (ex == null) {
2526     try {
2527 dl 1.20 if (e != null)
2528 dl 1.28 e.execute(new AsyncAccept<T>(t, fn, dst));
2529 dl 1.20 else
2530 dl 1.7 fn.accept(t);
2531     } catch (Throwable rex) {
2532 dl 1.19 ex = rex;
2533 dl 1.7 }
2534     }
2535 dl 1.20 if (e == null || ex != null)
2536     dst.internalComplete(null, ex);
2537 dl 1.7 }
2538 dl 1.20 helpPostComplete();
2539     other.helpPostComplete();
2540 dl 1.7 return dst;
2541     }
2542    
2543 dl 1.28 /**
2544 jsr166 1.60 * Returns a new CompletableFuture that is completed
2545 jsr166 1.66 * when either this or the other given CompletableFuture completes,
2546     * after performing the given action.
2547     *
2548 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2549     * exceptionally, exceptionally, or the supplied action throws
2550     * an unchecked exception, then the returned CompletableFuture may
2551     * also do so, with a CompletionException holding one of these
2552     * exceptions as its cause. No guarantees are made about which
2553     * result or exception is used in the returned CompletableFuture.
2554 dl 1.28 *
2555     * @param other the other CompletableFuture
2556     * @param action the action to perform before completing the
2557     * returned CompletableFuture
2558     * @return the new CompletableFuture
2559     */
2560     public CompletableFuture<Void> runAfterEither(CompletableFuture<?> other,
2561     Runnable action) {
2562     return doOrRun(other, action, null);
2563     }
2564    
2565     /**
2566 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
2567     * when either this or the other given CompletableFuture completes,
2568     * after performing the given action from a task running in the
2569     * {@link ForkJoinPool#commonPool()}.
2570     *
2571 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2572     * exceptionally, exceptionally, or the supplied action throws
2573     * an unchecked exception, then the returned CompletableFuture may
2574     * also do so, with a CompletionException holding one of these
2575     * exceptions as its cause. No guarantees are made about which
2576     * result or exception is used in the returned CompletableFuture.
2577 dl 1.28 *
2578     * @param other the other CompletableFuture
2579     * @param action the action to perform before completing the
2580     * returned CompletableFuture
2581     * @return the new CompletableFuture
2582     */
2583 dl 1.48 public CompletableFuture<Void> runAfterEitherAsync
2584     (CompletableFuture<?> other,
2585     Runnable action) {
2586 dl 1.28 return doOrRun(other, action, ForkJoinPool.commonPool());
2587     }
2588    
2589     /**
2590 jsr166 1.66 * Returns a new CompletableFuture that is asynchronously completed
2591     * when either this or the other given CompletableFuture completes,
2592     * after performing the given action from a task running in the
2593     * given executor.
2594     *
2595 dl 1.71 * <p>If this and/or the other CompletableFuture complete
2596     * exceptionally, exceptionally, or the supplied action throws
2597     * an unchecked exception, then the returned CompletableFuture may
2598     * also do so, with a CompletionException holding one of these
2599     * exceptions as its cause. No guarantees are made about which
2600     * result or exception is used in the returned CompletableFuture.
2601 dl 1.28 *
2602     * @param other the other CompletableFuture
2603     * @param action the action to perform before completing the
2604     * returned CompletableFuture
2605     * @param executor the executor to use for asynchronous execution
2606     * @return the new CompletableFuture
2607     */
2608 dl 1.48 public CompletableFuture<Void> runAfterEitherAsync
2609     (CompletableFuture<?> other,
2610     Runnable action,
2611     Executor executor) {
2612 dl 1.28 if (executor == null) throw new NullPointerException();
2613     return doOrRun(other, action, executor);
2614     }
2615    
2616     private CompletableFuture<Void> doOrRun(CompletableFuture<?> other,
2617     Runnable action,
2618     Executor e) {
2619 dl 1.1 if (other == null || action == null) throw new NullPointerException();
2620 jsr166 1.2 CompletableFuture<Void> dst = new CompletableFuture<Void>();
2621 dl 1.28 OrRunCompletion<T> d = null;
2622 jsr166 1.2 Object r;
2623     if ((r = result) == null && (r = other.result) == null) {
2624 dl 1.28 d = new OrRunCompletion<T>(this, other, action, dst, e);
2625 dl 1.1 CompletionNode q = null, p = new CompletionNode(d);
2626     while ((r = result) == null && (r = other.result) == null) {
2627     if (q != null) {
2628     if (UNSAFE.compareAndSwapObject
2629     (other, COMPLETIONS, q.next = other.completions, q))
2630     break;
2631     }
2632     else if (UNSAFE.compareAndSwapObject
2633     (this, COMPLETIONS, p.next = completions, p))
2634     q = new CompletionNode(d);
2635     }
2636 jsr166 1.2 }
2637     if (r != null && (d == null || d.compareAndSet(0, 1))) {
2638 dl 1.19 Throwable ex;
2639     if (r instanceof AltResult)
2640     ex = ((AltResult)r).ex;
2641     else
2642     ex = null;
2643     if (ex == null) {
2644 dl 1.1 try {
2645 dl 1.20 if (e != null)
2646 dl 1.28 e.execute(new AsyncRun(action, dst));
2647 dl 1.20 else
2648 dl 1.1 action.run();
2649     } catch (Throwable rex) {
2650 dl 1.19 ex = rex;
2651 dl 1.1 }
2652     }
2653 dl 1.20 if (e == null || ex != null)
2654     dst.internalComplete(null, ex);
2655 jsr166 1.2 }
2656 dl 1.20 helpPostComplete();
2657     other.helpPostComplete();
2658 jsr166 1.2 return dst;
2659 dl 1.1 }
2660    
2661 dl 1.28 /**
2662 dl 1.68 * Returns a CompletableFuture that upon completion, has the same
2663     * value as produced by the given function of the result of this
2664     * CompletableFuture.
2665 jsr166 1.66 *
2666 dl 1.68 * <p>If this CompletableFuture completes exceptionally, then the
2667     * returned CompletableFuture also does so, with a
2668 dl 1.28 * CompletionException holding this exception as its cause.
2669 dl 1.68 * Similarly, if the computed CompletableFuture completes
2670     * exceptionally, then so does the returned CompletableFuture.
2671 dl 1.28 *
2672 jsr166 1.39 * @param fn the function returning a new CompletableFuture
2673 dl 1.68 * @return the CompletableFuture
2674 dl 1.28 */
2675 dl 1.48 public <U> CompletableFuture<U> thenCompose
2676     (Function<? super T, CompletableFuture<U>> fn) {
2677 dl 1.37 return doCompose(fn, null);
2678     }
2679    
2680     /**
2681 dl 1.68 * Returns a CompletableFuture that upon completion, has the same
2682     * value as that produced asynchronously using the {@link
2683     * ForkJoinPool#commonPool()} by the given function of the result
2684     * of this CompletableFuture.
2685 jsr166 1.66 *
2686 dl 1.68 * <p>If this CompletableFuture completes exceptionally, then the
2687     * returned CompletableFuture also does so, with a
2688 dl 1.37 * CompletionException holding this exception as its cause.
2689 dl 1.68 * Similarly, if the computed CompletableFuture completes
2690     * exceptionally, then so does the returned CompletableFuture.
2691 dl 1.37 *
2692 jsr166 1.39 * @param fn the function returning a new CompletableFuture
2693 dl 1.68 * @return the CompletableFuture
2694 dl 1.37 */
2695 dl 1.48 public <U> CompletableFuture<U> thenComposeAsync
2696     (Function<? super T, CompletableFuture<U>> fn) {
2697 dl 1.37 return doCompose(fn, ForkJoinPool.commonPool());
2698     }
2699    
2700     /**
2701 dl 1.68 * Returns a CompletableFuture that upon completion, has the same
2702     * value as that produced asynchronously using the given executor
2703     * by the given function of this CompletableFuture.
2704 jsr166 1.66 *
2705 dl 1.68 * <p>If this CompletableFuture completes exceptionally, then the
2706     * returned CompletableFuture also does so, with a
2707 dl 1.37 * CompletionException holding this exception as its cause.
2708 dl 1.68 * Similarly, if the computed CompletableFuture completes
2709     * exceptionally, then so does the returned CompletableFuture.
2710 dl 1.37 *
2711 jsr166 1.39 * @param fn the function returning a new CompletableFuture
2712 dl 1.37 * @param executor the executor to use for asynchronous execution
2713 jsr166 1.70 * @return the CompletableFuture
2714 dl 1.37 */
2715 dl 1.48 public <U> CompletableFuture<U> thenComposeAsync
2716     (Function<? super T, CompletableFuture<U>> fn,
2717     Executor executor) {
2718 dl 1.37 if (executor == null) throw new NullPointerException();
2719     return doCompose(fn, executor);
2720     }
2721    
2722 dl 1.48 private <U> CompletableFuture<U> doCompose
2723     (Function<? super T, CompletableFuture<U>> fn,
2724     Executor e) {
2725 dl 1.28 if (fn == null) throw new NullPointerException();
2726     CompletableFuture<U> dst = null;
2727     ComposeCompletion<T,U> d = null;
2728     Object r;
2729     if ((r = result) == null) {
2730     dst = new CompletableFuture<U>();
2731     CompletionNode p = new CompletionNode
2732 dl 1.37 (d = new ComposeCompletion<T,U>(this, fn, dst, e));
2733 dl 1.28 while ((r = result) == null) {
2734     if (UNSAFE.compareAndSwapObject
2735     (this, COMPLETIONS, p.next = completions, p))
2736     break;
2737     }
2738     }
2739     if (r != null && (d == null || d.compareAndSet(0, 1))) {
2740     T t; Throwable ex;
2741     if (r instanceof AltResult) {
2742     ex = ((AltResult)r).ex;
2743     t = null;
2744     }
2745     else {
2746     ex = null;
2747     @SuppressWarnings("unchecked") T tr = (T) r;
2748     t = tr;
2749     }
2750     if (ex == null) {
2751 dl 1.37 if (e != null) {
2752     if (dst == null)
2753     dst = new CompletableFuture<U>();
2754     e.execute(new AsyncCompose<T,U>(t, fn, dst));
2755     }
2756     else {
2757     try {
2758 jsr166 1.61 if ((dst = fn.apply(t)) == null)
2759     ex = new NullPointerException();
2760 dl 1.37 } catch (Throwable rex) {
2761     ex = rex;
2762     }
2763 jsr166 1.61 if (dst == null)
2764 dl 1.37 dst = new CompletableFuture<U>();
2765 dl 1.28 }
2766     }
2767 dl 1.37 if (e == null && ex != null)
2768 dl 1.28 dst.internalComplete(null, ex);
2769     }
2770     helpPostComplete();
2771     dst.helpPostComplete();
2772     return dst;
2773     }
2774    
2775     /**
2776 jsr166 1.66 * Returns a new CompletableFuture that is completed when this
2777     * CompletableFuture completes, with the result of the given
2778     * function of the exception triggering this CompletableFuture's
2779     * completion when it completes exceptionally; otherwise, if this
2780     * CompletableFuture completes normally, then the returned
2781     * CompletableFuture also completes normally with the same value.
2782 dl 1.28 *
2783     * @param fn the function to use to compute the value of the
2784     * returned CompletableFuture if this CompletableFuture completed
2785     * exceptionally
2786     * @return the new CompletableFuture
2787     */
2788 dl 1.48 public CompletableFuture<T> exceptionally
2789     (Function<Throwable, ? extends T> fn) {
2790 dl 1.28 if (fn == null) throw new NullPointerException();
2791     CompletableFuture<T> dst = new CompletableFuture<T>();
2792     ExceptionCompletion<T> d = null;
2793     Object r;
2794     if ((r = result) == null) {
2795     CompletionNode p =
2796     new CompletionNode(d = new ExceptionCompletion<T>(this, fn, dst));
2797     while ((r = result) == null) {
2798     if (UNSAFE.compareAndSwapObject(this, COMPLETIONS,
2799     p.next = completions, p))
2800     break;
2801     }
2802     }
2803     if (r != null && (d == null || d.compareAndSet(0, 1))) {
2804     T t = null; Throwable ex, dx = null;
2805     if (r instanceof AltResult) {
2806     if ((ex = ((AltResult)r).ex) != null) {
2807     try {
2808     t = fn.apply(ex);
2809     } catch (Throwable rex) {
2810     dx = rex;
2811     }
2812     }
2813     }
2814     else {
2815     @SuppressWarnings("unchecked") T tr = (T) r;
2816     t = tr;
2817     }
2818     dst.internalComplete(t, dx);
2819     }
2820     helpPostComplete();
2821     return dst;
2822     }
2823    
2824     /**
2825 jsr166 1.66 * Returns a new CompletableFuture that is completed when this
2826     * CompletableFuture completes, with the result of the given
2827     * function of the result and exception of this CompletableFuture's
2828     * completion. The given function is invoked with the result (or
2829     * {@code null} if none) and the exception (or {@code null} if none)
2830     * of this CompletableFuture when complete.
2831 dl 1.28 *
2832     * @param fn the function to use to compute the value of the
2833     * returned CompletableFuture
2834     * @return the new CompletableFuture
2835     */
2836 dl 1.48 public <U> CompletableFuture<U> handle
2837     (BiFunction<? super T, Throwable, ? extends U> fn) {
2838 dl 1.28 if (fn == null) throw new NullPointerException();
2839     CompletableFuture<U> dst = new CompletableFuture<U>();
2840     HandleCompletion<T,U> d = null;
2841     Object r;
2842     if ((r = result) == null) {
2843     CompletionNode p =
2844     new CompletionNode(d = new HandleCompletion<T,U>(this, fn, dst));
2845     while ((r = result) == null) {
2846     if (UNSAFE.compareAndSwapObject(this, COMPLETIONS,
2847     p.next = completions, p))
2848     break;
2849     }
2850     }
2851     if (r != null && (d == null || d.compareAndSet(0, 1))) {
2852     T t; Throwable ex;
2853     if (r instanceof AltResult) {
2854     ex = ((AltResult)r).ex;
2855     t = null;
2856     }
2857     else {
2858     ex = null;
2859     @SuppressWarnings("unchecked") T tr = (T) r;
2860     t = tr;
2861     }
2862     U u; Throwable dx;
2863     try {
2864     u = fn.apply(t, ex);
2865     dx = null;
2866     } catch (Throwable rex) {
2867     dx = rex;
2868     u = null;
2869     }
2870     dst.internalComplete(u, dx);
2871     }
2872     helpPostComplete();
2873     return dst;
2874     }
2875    
2876 dl 1.35
2877     /* ------------- Arbitrary-arity constructions -------------- */
2878    
2879     /*
2880     * The basic plan of attack is to recursively form binary
2881     * completion trees of elements. This can be overkill for small
2882     * sets, but scales nicely. The And/All vs Or/Any forms use the
2883     * same idea, but details differ.
2884     */
2885    
2886     /**
2887     * Returns a new CompletableFuture that is completed when all of
2888 jsr166 1.66 * the given CompletableFutures complete. If any of the given
2889 jsr166 1.69 * CompletableFutures complete exceptionally, then the returned
2890     * CompletableFuture also does so, with a CompletionException
2891     * holding this exception as its cause. Otherwise, the results,
2892     * if any, of the given CompletableFutures are not reflected in
2893     * the returned CompletableFuture, but may be obtained by
2894     * inspecting them individually. If no CompletableFutures are
2895     * provided, returns a CompletableFuture completed with the value
2896     * {@code null}.
2897 dl 1.35 *
2898     * <p>Among the applications of this method is to await completion
2899     * of a set of independent CompletableFutures before continuing a
2900     * program, as in: {@code CompletableFuture.allOf(c1, c2,
2901     * c3).join();}.
2902     *
2903     * @param cfs the CompletableFutures
2904 jsr166 1.59 * @return a new CompletableFuture that is completed when all of the
2905 dl 1.35 * given CompletableFutures complete
2906     * @throws NullPointerException if the array or any of its elements are
2907     * {@code null}
2908     */
2909     public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) {
2910     int len = cfs.length; // Directly handle empty and singleton cases
2911     if (len > 1)
2912     return allTree(cfs, 0, len - 1);
2913     else {
2914     CompletableFuture<Void> dst = new CompletableFuture<Void>();
2915     CompletableFuture<?> f;
2916     if (len == 0)
2917     dst.result = NIL;
2918     else if ((f = cfs[0]) == null)
2919     throw new NullPointerException();
2920     else {
2921     ThenCopy d = null;
2922     CompletionNode p = null;
2923     Object r;
2924     while ((r = f.result) == null) {
2925     if (d == null)
2926     d = new ThenCopy(f, dst);
2927     else if (p == null)
2928     p = new CompletionNode(d);
2929     else if (UNSAFE.compareAndSwapObject
2930     (f, COMPLETIONS, p.next = f.completions, p))
2931     break;
2932     }
2933     if (r != null && (d == null || d.compareAndSet(0, 1)))
2934     dst.internalComplete(null, (r instanceof AltResult) ?
2935     ((AltResult)r).ex : null);
2936     f.helpPostComplete();
2937     }
2938     return dst;
2939     }
2940     }
2941    
2942     /**
2943     * Recursively constructs an And'ed tree of CompletableFutures.
2944     * Called only when array known to have at least two elements.
2945     */
2946     private static CompletableFuture<Void> allTree(CompletableFuture<?>[] cfs,
2947     int lo, int hi) {
2948     CompletableFuture<?> fst, snd;
2949     int mid = (lo + hi) >>> 1;
2950     if ((fst = (lo == mid ? cfs[lo] : allTree(cfs, lo, mid))) == null ||
2951     (snd = (hi == mid+1 ? cfs[hi] : allTree(cfs, mid+1, hi))) == null)
2952     throw new NullPointerException();
2953     CompletableFuture<Void> dst = new CompletableFuture<Void>();
2954     AndCompletion d = null;
2955     CompletionNode p = null, q = null;
2956     Object r = null, s = null;
2957     while ((r = fst.result) == null || (s = snd.result) == null) {
2958     if (d == null)
2959     d = new AndCompletion(fst, snd, dst);
2960     else if (p == null)
2961     p = new CompletionNode(d);
2962     else if (q == null) {
2963     if (UNSAFE.compareAndSwapObject
2964     (fst, COMPLETIONS, p.next = fst.completions, p))
2965     q = new CompletionNode(d);
2966     }
2967     else if (UNSAFE.compareAndSwapObject
2968     (snd, COMPLETIONS, q.next = snd.completions, q))
2969     break;
2970     }
2971     if ((r != null || (r = fst.result) != null) &&
2972     (s != null || (s = snd.result) != null) &&
2973     (d == null || d.compareAndSet(0, 1))) {
2974     Throwable ex;
2975     if (r instanceof AltResult)
2976     ex = ((AltResult)r).ex;
2977     else
2978     ex = null;
2979     if (ex == null && (s instanceof AltResult))
2980     ex = ((AltResult)s).ex;
2981     dst.internalComplete(null, ex);
2982     }
2983     fst.helpPostComplete();
2984     snd.helpPostComplete();
2985     return dst;
2986     }
2987    
2988     /**
2989 jsr166 1.69 * Returns a new CompletableFuture that is completed when any of the
2990     * given CompletableFutures complete, with the same result if it
2991     * completed normally. Otherwise, if it completed exceptionally,
2992     * the returned CompletableFuture also does so, with a
2993     * CompletionException holding this exception as its cause. If no
2994 jsr166 1.66 * CompletableFutures are provided, returns an incomplete
2995     * CompletableFuture.
2996 dl 1.35 *
2997     * @param cfs the CompletableFutures
2998 jsr166 1.59 * @return a new CompletableFuture that is completed when any of the
2999 dl 1.35 * given CompletableFutures complete
3000     * @throws NullPointerException if the array or any of its elements are
3001     * {@code null}
3002     */
3003     public static CompletableFuture<?> anyOf(CompletableFuture<?>... cfs) {
3004     int len = cfs.length; // Same idea as allOf
3005     if (len > 1)
3006     return anyTree(cfs, 0, len - 1);
3007     else {
3008     CompletableFuture<?> dst = new CompletableFuture<Object>();
3009     CompletableFuture<?> f;
3010     if (len == 0)
3011 dl 1.48 ; // skip
3012 dl 1.35 else if ((f = cfs[0]) == null)
3013     throw new NullPointerException();
3014     else {
3015     ThenCopy d = null;
3016     CompletionNode p = null;
3017     Object r;
3018     while ((r = f.result) == null) {
3019     if (d == null)
3020     d = new ThenCopy(f, dst);
3021     else if (p == null)
3022     p = new CompletionNode(d);
3023     else if (UNSAFE.compareAndSwapObject
3024     (f, COMPLETIONS, p.next = f.completions, p))
3025     break;
3026     }
3027     if (r != null && (d == null || d.compareAndSet(0, 1))) {
3028     Throwable ex; Object t;
3029     if (r instanceof AltResult) {
3030     ex = ((AltResult)r).ex;
3031     t = null;
3032     }
3033     else {
3034     ex = null;
3035     t = r;
3036     }
3037     dst.internalComplete(t, ex);
3038     }
3039     f.helpPostComplete();
3040     }
3041     return dst;
3042     }
3043     }
3044    
3045     /**
3046 jsr166 1.44 * Recursively constructs an Or'ed tree of CompletableFutures.
3047 dl 1.35 */
3048     private static CompletableFuture<?> anyTree(CompletableFuture<?>[] cfs,
3049     int lo, int hi) {
3050     CompletableFuture<?> fst, snd;
3051     int mid = (lo + hi) >>> 1;
3052     if ((fst = (lo == mid ? cfs[lo] : anyTree(cfs, lo, mid))) == null ||
3053     (snd = (hi == mid+1 ? cfs[hi] : anyTree(cfs, mid+1, hi))) == null)
3054     throw new NullPointerException();
3055     CompletableFuture<?> dst = new CompletableFuture<Object>();
3056     OrCompletion d = null;
3057     CompletionNode p = null, q = null;
3058     Object r;
3059     while ((r = fst.result) == null && (r = snd.result) == null) {
3060     if (d == null)
3061     d = new OrCompletion(fst, snd, dst);
3062     else if (p == null)
3063     p = new CompletionNode(d);
3064     else if (q == null) {
3065     if (UNSAFE.compareAndSwapObject
3066     (fst, COMPLETIONS, p.next = fst.completions, p))
3067     q = new CompletionNode(d);
3068     }
3069     else if (UNSAFE.compareAndSwapObject
3070     (snd, COMPLETIONS, q.next = snd.completions, q))
3071     break;
3072     }
3073     if ((r != null || (r = fst.result) != null ||
3074     (r = snd.result) != null) &&
3075     (d == null || d.compareAndSet(0, 1))) {
3076     Throwable ex; Object t;
3077     if (r instanceof AltResult) {
3078     ex = ((AltResult)r).ex;
3079     t = null;
3080     }
3081     else {
3082     ex = null;
3083     t = r;
3084     }
3085     dst.internalComplete(t, ex);
3086     }
3087     fst.helpPostComplete();
3088     snd.helpPostComplete();
3089     return dst;
3090     }
3091    
3092    
3093     /* ------------- Control and status methods -------------- */
3094    
3095 dl 1.28 /**
3096 dl 1.37 * If not already completed, completes this CompletableFuture with
3097     * a {@link CancellationException}. Dependent CompletableFutures
3098     * that have not already completed will also complete
3099     * exceptionally, with a {@link CompletionException} caused by
3100     * this {@code CancellationException}.
3101 dl 1.28 *
3102     * @param mayInterruptIfRunning this value has no effect in this
3103     * implementation because interrupts are not used to control
3104     * processing.
3105     *
3106     * @return {@code true} if this task is now cancelled
3107     */
3108     public boolean cancel(boolean mayInterruptIfRunning) {
3109 dl 1.46 boolean cancelled = (result == null) &&
3110     UNSAFE.compareAndSwapObject
3111     (this, RESULT, null, new AltResult(new CancellationException()));
3112     postComplete();
3113 dl 1.48 return cancelled || isCancelled();
3114 dl 1.28 }
3115    
3116     /**
3117     * Returns {@code true} if this CompletableFuture was cancelled
3118     * before it completed normally.
3119     *
3120     * @return {@code true} if this CompletableFuture was cancelled
3121     * before it completed normally
3122     */
3123     public boolean isCancelled() {
3124     Object r;
3125 jsr166 1.43 return ((r = result) instanceof AltResult) &&
3126     (((AltResult)r).ex instanceof CancellationException);
3127 dl 1.28 }
3128    
3129     /**
3130     * Forcibly sets or resets the value subsequently returned by
3131 jsr166 1.42 * method {@link #get()} and related methods, whether or not
3132     * already completed. This method is designed for use only in
3133     * error recovery actions, and even in such situations may result
3134     * in ongoing dependent completions using established versus
3135 dl 1.30 * overwritten outcomes.
3136 dl 1.28 *
3137     * @param value the completion value
3138     */
3139     public void obtrudeValue(T value) {
3140     result = (value == null) ? NIL : value;
3141     postComplete();
3142     }
3143    
3144 dl 1.30 /**
3145 jsr166 1.41 * Forcibly causes subsequent invocations of method {@link #get()}
3146     * and related methods to throw the given exception, whether or
3147     * not already completed. This method is designed for use only in
3148 dl 1.30 * recovery actions, and even in such situations may result in
3149     * ongoing dependent completions using established versus
3150     * overwritten outcomes.
3151     *
3152     * @param ex the exception
3153     */
3154     public void obtrudeException(Throwable ex) {
3155     if (ex == null) throw new NullPointerException();
3156     result = new AltResult(ex);
3157     postComplete();
3158     }
3159    
3160 dl 1.35 /**
3161     * Returns the estimated number of CompletableFutures whose
3162     * completions are awaiting completion of this CompletableFuture.
3163     * This method is designed for use in monitoring system state, not
3164     * for synchronization control.
3165     *
3166     * @return the number of dependent CompletableFutures
3167     */
3168     public int getNumberOfDependents() {
3169     int count = 0;
3170     for (CompletionNode p = completions; p != null; p = p.next)
3171     ++count;
3172     return count;
3173     }
3174    
3175     /**
3176     * Returns a string identifying this CompletableFuture, as well as
3177 jsr166 1.40 * its completion state. The state, in brackets, contains the
3178 dl 1.35 * String {@code "Completed Normally"} or the String {@code
3179     * "Completed Exceptionally"}, or the String {@code "Not
3180     * completed"} followed by the number of CompletableFutures
3181     * dependent upon its completion, if any.
3182     *
3183     * @return a string identifying this CompletableFuture, as well as its state
3184     */
3185     public String toString() {
3186     Object r = result;
3187 jsr166 1.40 int count;
3188     return super.toString() +
3189     ((r == null) ?
3190     (((count = getNumberOfDependents()) == 0) ?
3191     "[Not completed]" :
3192     "[Not completed, " + count + " dependents]") :
3193     (((r instanceof AltResult) && ((AltResult)r).ex != null) ?
3194     "[Completed exceptionally]" :
3195     "[Completed normally]"));
3196 dl 1.35 }
3197    
3198 dl 1.1 // Unsafe mechanics
3199     private static final sun.misc.Unsafe UNSAFE;
3200     private static final long RESULT;
3201     private static final long WAITERS;
3202     private static final long COMPLETIONS;
3203     static {
3204     try {
3205     UNSAFE = sun.misc.Unsafe.getUnsafe();
3206     Class<?> k = CompletableFuture.class;
3207     RESULT = UNSAFE.objectFieldOffset
3208     (k.getDeclaredField("result"));
3209     WAITERS = UNSAFE.objectFieldOffset
3210     (k.getDeclaredField("waiters"));
3211     COMPLETIONS = UNSAFE.objectFieldOffset
3212     (k.getDeclaredField("completions"));
3213     } catch (Exception e) {
3214     throw new Error(e);
3215     }
3216     }
3217     }