1a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson/*
2a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * Written by Doug Lea with assistance from members of JCP JSR-166
3a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * Expert Group and released to the public domain, as explained at
4a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * http://creativecommons.org/publicdomain/zero/1.0/
5a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson */
6a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
7a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonpackage java.util.concurrent;
8a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
9a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.io.Serializable;
10a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.Collection;
11a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.List;
12a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.RandomAccess;
13a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.lang.ref.WeakReference;
14a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.lang.ref.ReferenceQueue;
15a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.concurrent.Callable;
16a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.concurrent.CancellationException;
17a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.concurrent.ExecutionException;
18a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.concurrent.Future;
19a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.concurrent.RejectedExecutionException;
20a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.concurrent.RunnableFuture;
21a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.concurrent.TimeUnit;
22a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.concurrent.TimeoutException;
23a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.util.concurrent.locks.ReentrantLock;
24a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport java.lang.reflect.Constructor;
25a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonimport libcore.util.SneakyThrow;
26a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
27a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson/**
28a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * Abstract base class for tasks that run within a {@link ForkJoinPool}.
29a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * A {@code ForkJoinTask} is a thread-like entity that is much
30a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * lighter weight than a normal thread.  Huge numbers of tasks and
31a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * subtasks may be hosted by a small number of actual threads in a
32a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * ForkJoinPool, at the price of some usage limitations.
33a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
34a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>A "main" {@code ForkJoinTask} begins execution when submitted
35a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * to a {@link ForkJoinPool}.  Once started, it will usually in turn
36a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * start other subtasks.  As indicated by the name of this class,
37a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * many programs using {@code ForkJoinTask} employ only methods
38a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * {@link #fork} and {@link #join}, or derivatives such as {@link
39a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * #invokeAll(ForkJoinTask...) invokeAll}.  However, this class also
40a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * provides a number of other methods that can come into play in
41a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * advanced usages, as well as extension mechanics that allow
42a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * support of new forms of fork/join processing.
43a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
44a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>A {@code ForkJoinTask} is a lightweight form of {@link Future}.
45a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * The efficiency of {@code ForkJoinTask}s stems from a set of
46a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * restrictions (that are only partially statically enforceable)
47a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * reflecting their intended use as computational tasks calculating
48a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * pure functions or operating on purely isolated objects.  The
49a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * primary coordination mechanisms are {@link #fork}, that arranges
50a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * asynchronous execution, and {@link #join}, that doesn't proceed
51a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * until the task's result has been computed.  Computations should
52a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * avoid {@code synchronized} methods or blocks, and should minimize
53a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * other blocking synchronization apart from joining other tasks or
54a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * using synchronizers such as Phasers that are advertised to
55a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * cooperate with fork/join scheduling. Tasks should also not perform
56a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * blocking IO, and should ideally access variables that are
57a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * completely independent of those accessed by other running
58a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * tasks. Minor breaches of these restrictions, for example using
59a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * shared output streams, may be tolerable in practice, but frequent
60a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * use may result in poor performance, and the potential to
61a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * indefinitely stall if the number of threads not waiting for IO or
62a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * other external synchronization becomes exhausted. This usage
63a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * restriction is in part enforced by not permitting checked
64a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * exceptions such as {@code IOExceptions} to be thrown. However,
65a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * computations may still encounter unchecked exceptions, that are
66a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * rethrown to callers attempting to join them. These exceptions may
67a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * additionally include {@link RejectedExecutionException} stemming
68a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * from internal resource exhaustion, such as failure to allocate
69a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * internal task queues. Rethrown exceptions behave in the same way as
70a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * regular exceptions, but, when possible, contain stack traces (as
71a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * displayed for example using {@code ex.printStackTrace()}) of both
72a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * the thread that initiated the computation as well as the thread
73a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * actually encountering the exception; minimally only the latter.
74a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
75a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>The primary method for awaiting completion and extracting
76a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * results of a task is {@link #join}, but there are several variants:
77a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * The {@link Future#get} methods support interruptible and/or timed
78a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * waits for completion and report results using {@code Future}
79a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * conventions. Method {@link #invoke} is semantically
80a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * equivalent to {@code fork(); join()} but always attempts to begin
81a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * execution in the current thread. The "<em>quiet</em>" forms of
82a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * these methods do not extract results or report exceptions. These
83a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * may be useful when a set of tasks are being executed, and you need
84a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * to delay processing of results or exceptions until all complete.
85a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * Method {@code invokeAll} (available in multiple versions)
86a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * performs the most common form of parallel invocation: forking a set
87a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * of tasks and joining them all.
88a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
89a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>The execution status of tasks may be queried at several levels
90a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * of detail: {@link #isDone} is true if a task completed in any way
91a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * (including the case where a task was cancelled without executing);
92a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * {@link #isCompletedNormally} is true if a task completed without
93a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * cancellation or encountering an exception; {@link #isCancelled} is
94a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * true if the task was cancelled (in which case {@link #getException}
95a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * returns a {@link java.util.concurrent.CancellationException}); and
96a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * {@link #isCompletedAbnormally} is true if a task was either
97a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * cancelled or encountered an exception, in which case {@link
98a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * #getException} will return either the encountered exception or
99a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * {@link java.util.concurrent.CancellationException}.
100a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
101a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>The ForkJoinTask class is not usually directly subclassed.
102a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * Instead, you subclass one of the abstract classes that support a
103a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * particular style of fork/join processing, typically {@link
104a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * RecursiveAction} for computations that do not return results, or
105a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * {@link RecursiveTask} for those that do.  Normally, a concrete
106a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * ForkJoinTask subclass declares fields comprising its parameters,
107a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * established in a constructor, and then defines a {@code compute}
108a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * method that somehow uses the control methods supplied by this base
109a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * class. While these methods have {@code public} access (to allow
110a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * instances of different task subclasses to call each other's
111a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * methods), some of them may only be called from within other
112a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * ForkJoinTasks (as may be determined using method {@link
113a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * #inForkJoinPool}).  Attempts to invoke them in other contexts
114a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * result in exceptions or errors, possibly including
115a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * {@code ClassCastException}.
116a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
117a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>Method {@link #join} and its variants are appropriate for use
118a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * only when completion dependencies are acyclic; that is, the
119a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * parallel computation can be described as a directed acyclic graph
120a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * (DAG). Otherwise, executions may encounter a form of deadlock as
121a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * tasks cyclically wait for each other.  However, this framework
122a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * supports other methods and techniques (for example the use of
123a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * {@link Phaser}, {@link #helpQuiesce}, and {@link #complete}) that
124a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * may be of use in constructing custom subclasses for problems that
125a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * are not statically structured as DAGs.
126a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
127a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>Most base support methods are {@code final}, to prevent
128a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * overriding of implementations that are intrinsically tied to the
129a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * underlying lightweight task scheduling framework.  Developers
130a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * creating new basic styles of fork/join processing should minimally
131a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * implement {@code protected} methods {@link #exec}, {@link
132a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * #setRawResult}, and {@link #getRawResult}, while also introducing
133a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * an abstract computational method that can be implemented in its
134a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * subclasses, possibly relying on other {@code protected} methods
135a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * provided by this class.
136a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
137a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>ForkJoinTasks should perform relatively small amounts of
138a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * computation. Large tasks should be split into smaller subtasks,
139a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * usually via recursive decomposition. As a very rough rule of thumb,
140a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * a task should perform more than 100 and less than 10000 basic
141a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * computational steps, and should avoid indefinite looping. If tasks
142a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * are too big, then parallelism cannot improve throughput. If too
143a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * small, then memory and internal task maintenance overhead may
144a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * overwhelm processing.
145a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
146a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>This class provides {@code adapt} methods for {@link Runnable}
147a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * and {@link Callable}, that may be of use when mixing execution of
148a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * {@code ForkJoinTasks} with other kinds of tasks. When all tasks are
149a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * of this form, consider using a pool constructed in <em>asyncMode</em>.
150a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
151a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * <p>ForkJoinTasks are {@code Serializable}, which enables them to be
152a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * used in extensions such as remote execution frameworks. It is
153a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * sensible to serialize tasks only before or after, but not during,
154a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * execution. Serialization is not relied on during execution itself.
155a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson *
156a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * @since 1.7
157a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * @hide
158a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson * @author Doug Lea
159a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson */
160a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilsonpublic abstract class ForkJoinTask<V> implements Future<V>, Serializable {
161a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
162a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /*
163a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * See the internal documentation of class ForkJoinPool for a
164a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * general implementation overview.  ForkJoinTasks are mainly
165a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * responsible for maintaining their "status" field amidst relays
166a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * to methods in ForkJoinWorkerThread and ForkJoinPool.
167a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
168a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * The methods of this class are more-or-less layered into
169a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * (1) basic status maintenance
170a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * (2) execution and awaiting completion
171a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * (3) user-level methods that additionally report results.
172a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * This is sometimes hard to see because this file orders exported
173a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * methods in a way that flows well in javadocs.
174a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
175a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
176a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /*
177a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * The status field holds run control status bits packed into a
178a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * single int to minimize footprint and to ensure atomicity (via
179a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * CAS).  Status is initially zero, and takes on nonnegative
180a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * values until completed, upon which status holds value
181a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * NORMAL, CANCELLED, or EXCEPTIONAL. Tasks undergoing blocking
182a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * waits by other threads have the SIGNAL bit set.  Completion of
183a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * a stolen task with SIGNAL set awakens any waiters via
184a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * notifyAll. Even though suboptimal for some purposes, we use
185a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * basic builtin wait/notify to take advantage of "monitor
186a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * inflation" in JVMs that we would otherwise need to emulate to
187a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * avoid adding further per-task bookkeeping overhead.  We want
188a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * these monitors to be "fat", i.e., not use biasing or thin-lock
189a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * techniques, so use some odd coding idioms that tend to avoid
190a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * them.
191a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
192a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
193a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /** The run status of this task */
194a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    volatile int status; // accessed directly by pool and workers
195a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final int NORMAL      = -1;
196a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final int CANCELLED   = -2;
197a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final int EXCEPTIONAL = -3;
198a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final int SIGNAL      =  1;
199a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
200a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
201a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Marks completion and wakes up threads waiting to join this task,
202a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * also clearing signal request bits.
203a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
204a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param completion one of NORMAL, CANCELLED, EXCEPTIONAL
205a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return completion status on exit
206a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
207a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private int setCompletion(int completion) {
208a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        for (int s;;) {
209a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if ((s = status) < 0)
210a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                return s;
211a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (UNSAFE.compareAndSwapInt(this, statusOffset, s, completion)) {
212a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (s != 0)
213a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    synchronized (this) { notifyAll(); }
214a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                return completion;
215a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
216a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
217a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
218a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
219a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
220a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Tries to block a worker thread until completed or timed out.
221a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Uses Object.wait time argument conventions.
222a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * May fail on contention or interrupt.
223a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
224a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param millis if > 0, wait time.
225a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
226a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    final void tryAwaitDone(long millis) {
227a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int s;
228a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        try {
229a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (((s = status) > 0 ||
230a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                 (s == 0 &&
231a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                  UNSAFE.compareAndSwapInt(this, statusOffset, 0, SIGNAL))) &&
232a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                status > 0) {
233a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                synchronized (this) {
234a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    if (status > 0)
235a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        wait(millis);
236a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                }
237a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
238a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        } catch (InterruptedException ie) {
239a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            // caller must check termination
240a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
241a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
242a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
243a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
244a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Blocks a non-worker-thread until completion.
245a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return status upon completion
246a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
247a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private int externalAwaitDone() {
248a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int s;
249a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if ((s = status) >= 0) {
250a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            boolean interrupted = false;
251a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            synchronized (this) {
252a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                while ((s = status) >= 0) {
253a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    if (s == 0)
254a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        UNSAFE.compareAndSwapInt(this, statusOffset,
255a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                                                 0, SIGNAL);
256a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    else {
257a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        try {
258a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                            wait();
259a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        } catch (InterruptedException ie) {
260a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                            interrupted = true;
261a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        }
262a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    }
263a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                }
264a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
265a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (interrupted)
266a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                Thread.currentThread().interrupt();
267a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
268a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return s;
269a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
270a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
271a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
272a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Blocks a non-worker-thread until completion or interruption or timeout.
273a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
274a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private int externalInterruptibleAwaitDone(long millis)
275a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        throws InterruptedException {
276a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int s;
277a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (Thread.interrupted())
278a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            throw new InterruptedException();
279a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if ((s = status) >= 0) {
280a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            synchronized (this) {
281a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                while ((s = status) >= 0) {
282a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    if (s == 0)
283a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        UNSAFE.compareAndSwapInt(this, statusOffset,
284a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                                                 0, SIGNAL);
285a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    else {
286a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        wait(millis);
287a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        if (millis > 0L)
288a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                            break;
289a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    }
290a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                }
291a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
292a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
293a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return s;
294a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
295a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
296a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
297a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Primary execution method for stolen tasks. Unless done, calls
298a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * exec and records status if completed, but doesn't wait for
299a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * completion otherwise.
300a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
301a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    final void doExec() {
302a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (status >= 0) {
303a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            boolean completed;
304a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            try {
305a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                completed = exec();
306a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            } catch (Throwable rex) {
307a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                setExceptionalCompletion(rex);
308a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                return;
309a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
310a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (completed)
311a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                setCompletion(NORMAL); // must be outside try block
312a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
313a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
314a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
315a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
316a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Primary mechanics for join, get, quietlyJoin.
317a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return status upon completion
318a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
319a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private int doJoin() {
320a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        Thread t; ForkJoinWorkerThread w; int s; boolean completed;
321a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) {
322a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if ((s = status) < 0)
323a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                return s;
324a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if ((w = (ForkJoinWorkerThread)t).unpushTask(this)) {
325a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                try {
326a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    completed = exec();
327a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                } catch (Throwable rex) {
328a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    return setExceptionalCompletion(rex);
329a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                }
330a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (completed)
331a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    return setCompletion(NORMAL);
332a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
333a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return w.joinTask(this);
334a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
335a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        else
336a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return externalAwaitDone();
337a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
338a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
339a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
340a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Primary mechanics for invoke, quietlyInvoke.
341a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return status upon completion
342a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
343a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private int doInvoke() {
344a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int s; boolean completed;
345a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if ((s = status) < 0)
346a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return s;
347a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        try {
348a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            completed = exec();
349a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        } catch (Throwable rex) {
350a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return setExceptionalCompletion(rex);
351a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
352a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (completed)
353a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return setCompletion(NORMAL);
354a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        else
355a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return doJoin();
356a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
357a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
358a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    // Exception table support
359a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
360a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
361a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Table of exceptions thrown by tasks, to enable reporting by
362a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * callers. Because exceptions are rare, we don't directly keep
363a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * them with task objects, but instead use a weak ref table.  Note
364a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * that cancellation exceptions don't appear in the table, but are
365a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * instead recorded as status values.
366a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
367a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Note: These statics are initialized below in static block.
368a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
369a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final ExceptionNode[] exceptionTable;
370a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final ReentrantLock exceptionTableLock;
371a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final ReferenceQueue<Object> exceptionTableRefQueue;
372a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
373a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
374a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Fixed capacity for exceptionTable.
375a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
376a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final int EXCEPTION_MAP_CAPACITY = 32;
377a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
378a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
379a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Key-value nodes for exception table.  The chained hash table
380a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * uses identity comparisons, full locking, and weak references
381a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * for keys. The table has a fixed capacity because it only
382a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * maintains task exceptions long enough for joiners to access
383a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * them, so should never become very large for sustained
384a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * periods. However, since we do not know when the last joiner
385a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * completes, we must use weak references and expunge them. We do
386a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * so on each operation (hence full locking). Also, some thread in
387a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * any ForkJoinPool will call helpExpungeStaleExceptions when its
388a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * pool becomes isQuiescent.
389a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
390a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    static final class ExceptionNode extends WeakReference<ForkJoinTask<?>>{
391a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        final Throwable ex;
392a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        ExceptionNode next;
393a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        final long thrower;  // use id not ref to avoid weak cycles
394a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        ExceptionNode(ForkJoinTask<?> task, Throwable ex, ExceptionNode next) {
395a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            super(task, exceptionTableRefQueue);
396a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            this.ex = ex;
397a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            this.next = next;
398a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            this.thrower = Thread.currentThread().getId();
399a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
400a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
401a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
402a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
403a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Records exception and sets exceptional completion.
404a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
405a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return status on exit
406a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
407a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private int setExceptionalCompletion(Throwable ex) {
408a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int h = System.identityHashCode(this);
409a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        final ReentrantLock lock = exceptionTableLock;
410a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        lock.lock();
411a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        try {
412a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            expungeStaleExceptions();
413a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            ExceptionNode[] t = exceptionTable;
414a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            int i = h & (t.length - 1);
415a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            for (ExceptionNode e = t[i]; ; e = e.next) {
416a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (e == null) {
417a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    t[i] = new ExceptionNode(this, ex, t[i]);
418a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    break;
419a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                }
420a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (e.get() == this) // already present
421a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    break;
422a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
423a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        } finally {
424a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            lock.unlock();
425a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
426a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return setCompletion(EXCEPTIONAL);
427a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
428a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
429a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
430a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Removes exception node and clears status
431a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
432a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private void clearExceptionalCompletion() {
433a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int h = System.identityHashCode(this);
434a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        final ReentrantLock lock = exceptionTableLock;
435a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        lock.lock();
436a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        try {
437a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            ExceptionNode[] t = exceptionTable;
438a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            int i = h & (t.length - 1);
439a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            ExceptionNode e = t[i];
440a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            ExceptionNode pred = null;
441a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            while (e != null) {
442a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                ExceptionNode next = e.next;
443a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (e.get() == this) {
444a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    if (pred == null)
445a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        t[i] = next;
446a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    else
447a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        pred.next = next;
448a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    break;
449a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                }
450a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                pred = e;
451a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                e = next;
452a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
453a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            expungeStaleExceptions();
454a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            status = 0;
455a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        } finally {
456a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            lock.unlock();
457a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
458a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
459a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
460a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
461a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns a rethrowable exception for the given task, if
462a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * available. To provide accurate stack traces, if the exception
463a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * was not thrown by the current thread, we try to create a new
464a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * exception of the same type as the one thrown, but with the
465a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * recorded exception as its cause. If there is no such
466a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * constructor, we instead try to use a no-arg constructor,
467a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * followed by initCause, to the same effect. If none of these
468a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * apply, or any fail due to other exceptions, we return the
469a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * recorded exception, which is still correct, although it may
470a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * contain a misleading stack trace.
471a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
472a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the exception, or null if none
473a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
474a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private Throwable getThrowableException() {
475a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (status != EXCEPTIONAL)
476a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return null;
477a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int h = System.identityHashCode(this);
478a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        ExceptionNode e;
479a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        final ReentrantLock lock = exceptionTableLock;
480a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        lock.lock();
481a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        try {
482a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            expungeStaleExceptions();
483a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            ExceptionNode[] t = exceptionTable;
484a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            e = t[h & (t.length - 1)];
485a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            while (e != null && e.get() != this)
486a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                e = e.next;
487a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        } finally {
488a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            lock.unlock();
489a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
490a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        Throwable ex;
491a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (e == null || (ex = e.ex) == null)
492a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return null;
493a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (e.thrower != Thread.currentThread().getId()) {
494a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            Class<? extends Throwable> ec = ex.getClass();
495a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            try {
496a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                Constructor<?> noArgCtor = null;
497a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                Constructor<?>[] cs = ec.getConstructors();// public ctors only
498a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                for (int i = 0; i < cs.length; ++i) {
499a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    Constructor<?> c = cs[i];
500a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    Class<?>[] ps = c.getParameterTypes();
501a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    if (ps.length == 0)
502a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        noArgCtor = c;
503a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    else if (ps.length == 1 && ps[0] == Throwable.class)
504a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        return (Throwable)(c.newInstance(ex));
505a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                }
506a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (noArgCtor != null) {
507a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    Throwable wx = (Throwable)(noArgCtor.newInstance());
508a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    wx.initCause(ex);
509a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    return wx;
510a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                }
511a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            } catch (Exception ignore) {
512a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
513a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
514a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return ex;
515a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
516a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
517a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
518a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Poll stale refs and remove them. Call only while holding lock.
519a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
520a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static void expungeStaleExceptions() {
521a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        for (Object x; (x = exceptionTableRefQueue.poll()) != null;) {
522a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (x instanceof ExceptionNode) {
523a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                ForkJoinTask<?> key = ((ExceptionNode)x).get();
524a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                ExceptionNode[] t = exceptionTable;
525a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                int i = System.identityHashCode(key) & (t.length - 1);
526a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                ExceptionNode e = t[i];
527a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                ExceptionNode pred = null;
528a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                while (e != null) {
529a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    ExceptionNode next = e.next;
530a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    if (e == x) {
531a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        if (pred == null)
532a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                            t[i] = next;
533a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        else
534a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                            pred.next = next;
535a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        break;
536a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    }
537a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    pred = e;
538a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    e = next;
539a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                }
540a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
541a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
542a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
543a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
544a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
545a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * If lock is available, poll stale refs and remove them.
546a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Called from ForkJoinPool when pools become quiescent.
547a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
548a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    static final void helpExpungeStaleExceptions() {
549a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        final ReentrantLock lock = exceptionTableLock;
550a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (lock.tryLock()) {
551a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            try {
552a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                expungeStaleExceptions();
553a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            } finally {
554a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                lock.unlock();
555a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
556a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
557a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
558a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
559a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
560a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Report the result of invoke or join; called only upon
561a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * non-normal return of internal versions.
562a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
563a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private V reportResult() {
564a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int s; Throwable ex;
565a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if ((s = status) == CANCELLED)
566a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            throw new CancellationException();
567a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (s == EXCEPTIONAL && (ex = getThrowableException()) != null)
568a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            SneakyThrow.sneakyThrow(ex); // android-changed
569a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return getRawResult();
570a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
571a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
572a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    // public methods
573a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
574a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
575a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Arranges to asynchronously execute this task.  While it is not
576a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * necessarily enforced, it is a usage error to fork a task more
577a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * than once unless it has completed and been reinitialized.
578a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Subsequent modifications to the state of this task or any data
579a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * it operates on are not necessarily consistently observable by
580a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * any thread other than the one executing it unless preceded by a
581a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * call to {@link #join} or related methods, or a call to {@link
582a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * #isDone} returning {@code true}.
583a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
584a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be invoked only from within {@code
585a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinPool} computations (as may be determined using method
586a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #inForkJoinPool}).  Attempts to invoke in other contexts
587a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * result in exceptions or errors, possibly including {@code
588a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ClassCastException}.
589a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
590a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return {@code this}, to simplify usage
591a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
592a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final ForkJoinTask<V> fork() {
593a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        ((ForkJoinWorkerThread) Thread.currentThread())
594a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            .pushTask(this);
595a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return this;
596a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
597a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
598a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
599a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns the result of the computation when it {@link #isDone is
600a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * done}.  This method differs from {@link #get()} in that
601a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * abnormal completion results in {@code RuntimeException} or
602a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@code Error}, not {@code ExecutionException}, and that
603a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * interrupts of the calling thread do <em>not</em> cause the
604a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * method to abruptly return by throwing {@code
605a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * InterruptedException}.
606a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
607a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the computed result
608a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
609a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final V join() {
610a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (doJoin() != NORMAL)
611a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return reportResult();
612a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        else
613a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return getRawResult();
614a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
615a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
616a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
617a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Commences performing this task, awaits its completion if
618a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * necessary, and returns its result, or throws an (unchecked)
619a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@code RuntimeException} or {@code Error} if the underlying
620a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * computation did so.
621a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
622a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the computed result
623a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
624a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final V invoke() {
625a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (doInvoke() != NORMAL)
626a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return reportResult();
627a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        else
628a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return getRawResult();
629a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
630a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
631a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
632a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Forks the given tasks, returning when {@code isDone} holds for
633a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * each task or an (unchecked) exception is encountered, in which
634a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * case the exception is rethrown. If more than one task
635a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * encounters an exception, then this method throws any one of
636a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * these exceptions. If any task encounters an exception, the
637a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * other may be cancelled. However, the execution status of
638a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * individual tasks is not guaranteed upon exceptional return. The
639a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * status of each task may be obtained using {@link
640a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * #getException()} and related methods to check if they have been
641a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * cancelled, completed normally or exceptionally, or left
642a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * unprocessed.
643a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
644a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be invoked only from within {@code
645a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinPool} computations (as may be determined using method
646a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #inForkJoinPool}).  Attempts to invoke in other contexts
647a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * result in exceptions or errors, possibly including {@code
648a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ClassCastException}.
649a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
650a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param t1 the first task
651a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param t2 the second task
652a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @throws NullPointerException if any task is null
653a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
654a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static void invokeAll(ForkJoinTask<?> t1, ForkJoinTask<?> t2) {
655a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        t2.fork();
656a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        t1.invoke();
657a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        t2.join();
658a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
659a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
660a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
661a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Forks the given tasks, returning when {@code isDone} holds for
662a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * each task or an (unchecked) exception is encountered, in which
663a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * case the exception is rethrown. If more than one task
664a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * encounters an exception, then this method throws any one of
665a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * these exceptions. If any task encounters an exception, others
666a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * may be cancelled. However, the execution status of individual
667a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * tasks is not guaranteed upon exceptional return. The status of
668a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * each task may be obtained using {@link #getException()} and
669a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * related methods to check if they have been cancelled, completed
670a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * normally or exceptionally, or left unprocessed.
671a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
672a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be invoked only from within {@code
673a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinPool} computations (as may be determined using method
674a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #inForkJoinPool}).  Attempts to invoke in other contexts
675a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * result in exceptions or errors, possibly including {@code
676a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ClassCastException}.
677a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
678a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param tasks the tasks
679a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @throws NullPointerException if any task is null
680a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
681a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static void invokeAll(ForkJoinTask<?>... tasks) {
682a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        Throwable ex = null;
683a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int last = tasks.length - 1;
684a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        for (int i = last; i >= 0; --i) {
685a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            ForkJoinTask<?> t = tasks[i];
686a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (t == null) {
687a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (ex == null)
688a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    ex = new NullPointerException();
689a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
690a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            else if (i != 0)
691a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                t.fork();
692a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            else if (t.doInvoke() < NORMAL && ex == null)
693a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                ex = t.getException();
694a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
695a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        for (int i = 1; i <= last; ++i) {
696a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            ForkJoinTask<?> t = tasks[i];
697a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (t != null) {
698a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (ex != null)
699a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    t.cancel(false);
700a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                else if (t.doJoin() < NORMAL)
701a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    ex = t.getException();
702a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
703a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
704a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (ex != null)
705a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            SneakyThrow.sneakyThrow(ex); // android-changed
706a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
707a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
708a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
709a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Forks all tasks in the specified collection, returning when
710a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@code isDone} holds for each task or an (unchecked) exception
711a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * is encountered, in which case the exception is rethrown. If
712a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * more than one task encounters an exception, then this method
713a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * throws any one of these exceptions. If any task encounters an
714a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * exception, others may be cancelled. However, the execution
715a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * status of individual tasks is not guaranteed upon exceptional
716a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * return. The status of each task may be obtained using {@link
717a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * #getException()} and related methods to check if they have been
718a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * cancelled, completed normally or exceptionally, or left
719a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * unprocessed.
720a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
721a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be invoked only from within {@code
722a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinPool} computations (as may be determined using method
723a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #inForkJoinPool}).  Attempts to invoke in other contexts
724a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * result in exceptions or errors, possibly including {@code
725a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ClassCastException}.
726a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
727a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param tasks the collection of tasks
728a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the tasks argument, to simplify usage
729a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @throws NullPointerException if tasks or any element are null
730a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
731a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static <T extends ForkJoinTask<?>> Collection<T> invokeAll(Collection<T> tasks) {
732a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (!(tasks instanceof RandomAccess) || !(tasks instanceof List<?>)) {
733a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            invokeAll(tasks.toArray(new ForkJoinTask<?>[tasks.size()]));
734a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return tasks;
735a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
736a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        @SuppressWarnings("unchecked")
737a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        List<? extends ForkJoinTask<?>> ts =
738a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            (List<? extends ForkJoinTask<?>>) tasks;
739a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        Throwable ex = null;
740a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int last = ts.size() - 1;
741a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        for (int i = last; i >= 0; --i) {
742a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            ForkJoinTask<?> t = ts.get(i);
743a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (t == null) {
744a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (ex == null)
745a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    ex = new NullPointerException();
746a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
747a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            else if (i != 0)
748a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                t.fork();
749a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            else if (t.doInvoke() < NORMAL && ex == null)
750a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                ex = t.getException();
751a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
752a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        for (int i = 1; i <= last; ++i) {
753a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            ForkJoinTask<?> t = ts.get(i);
754a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (t != null) {
755a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (ex != null)
756a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    t.cancel(false);
757a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                else if (t.doJoin() < NORMAL)
758a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    ex = t.getException();
759a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
760a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
761a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (ex != null)
762a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            SneakyThrow.sneakyThrow(ex); // android-changed
763a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return tasks;
764a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
765a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
766a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
767a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Attempts to cancel execution of this task. This attempt will
768a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * fail if the task has already completed or could not be
769a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * cancelled for some other reason. If successful, and this task
770a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * has not started when {@code cancel} is called, execution of
771a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * this task is suppressed. After this method returns
772a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * successfully, unless there is an intervening call to {@link
773a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * #reinitialize}, subsequent calls to {@link #isCancelled},
774a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #isDone}, and {@code cancel} will return {@code true}
775a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * and calls to {@link #join} and related methods will result in
776a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@code CancellationException}.
777a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
778a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be overridden in subclasses, but if so, must
779a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * still ensure that these properties hold. In particular, the
780a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@code cancel} method itself must not throw exceptions.
781a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
782a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method is designed to be invoked by <em>other</em>
783a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * tasks. To terminate the current task, you can just return or
784a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * throw an unchecked exception from its computation method, or
785a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * invoke {@link #completeExceptionally}.
786a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
787a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param mayInterruptIfRunning this value has no effect in the
788a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * default implementation because interrupts are not used to
789a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * control cancellation.
790a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
791a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return {@code true} if this task is now cancelled
792a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
793a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public boolean cancel(boolean mayInterruptIfRunning) {
794a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return setCompletion(CANCELLED) == CANCELLED;
795a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
796a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
797a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
798a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Cancels, ignoring any exceptions thrown by cancel. Used during
799a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * worker and pool shutdown. Cancel is spec'ed not to throw any
800a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * exceptions, but if it does anyway, we have no recourse during
801a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * shutdown, so guard against this case.
802a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
803a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    final void cancelIgnoringExceptions() {
804a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        try {
805a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            cancel(false);
806a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        } catch (Throwable ignore) {
807a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
808a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
809a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
810a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final boolean isDone() {
811a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return status < 0;
812a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
813a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
814a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final boolean isCancelled() {
815a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return status == CANCELLED;
816a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
817a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
818a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
819a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns {@code true} if this task threw an exception or was cancelled.
820a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
821a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return {@code true} if this task threw an exception or was cancelled
822a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
823a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final boolean isCompletedAbnormally() {
824a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return status < NORMAL;
825a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
826a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
827a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
828a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns {@code true} if this task completed without throwing an
829a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * exception and was not cancelled.
830a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
831a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return {@code true} if this task completed without throwing an
832a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * exception and was not cancelled
833a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
834a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final boolean isCompletedNormally() {
835a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return status == NORMAL;
836a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
837a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
838a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
839a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns the exception thrown by the base computation, or a
840a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@code CancellationException} if cancelled, or {@code null} if
841a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * none or if the method has not yet completed.
842a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
843a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the exception, or {@code null} if none
844a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
845a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final Throwable getException() {
846a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int s = status;
847a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return ((s >= NORMAL)    ? null :
848a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                (s == CANCELLED) ? new CancellationException() :
849a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                getThrowableException());
850a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
851a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
852a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
853a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Completes this task abnormally, and if not already aborted or
854a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * cancelled, causes it to throw the given exception upon
855a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@code join} and related operations. This method may be used
856a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * to induce exceptions in asynchronous tasks, or to force
857a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * completion of tasks that would not otherwise complete.  Its use
858a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * in other situations is discouraged.  This method is
859a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * overridable, but overridden versions must invoke {@code super}
860a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * implementation to maintain guarantees.
861a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
862a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param ex the exception to throw. If this exception is not a
863a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@code RuntimeException} or {@code Error}, the actual exception
864a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * thrown will be a {@code RuntimeException} with cause {@code ex}.
865a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
866a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public void completeExceptionally(Throwable ex) {
867a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        setExceptionalCompletion((ex instanceof RuntimeException) ||
868a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                                 (ex instanceof Error) ? ex :
869a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                                 new RuntimeException(ex));
870a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
871a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
872a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
873a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Completes this task, and if not already aborted or cancelled,
874a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * returning the given value as the result of subsequent
875a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * invocations of {@code join} and related operations. This method
876a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * may be used to provide results for asynchronous tasks, or to
877a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * provide alternative handling for tasks that would not otherwise
878a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * complete normally. Its use in other situations is
879a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * discouraged. This method is overridable, but overridden
880a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * versions must invoke {@code super} implementation to maintain
881a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * guarantees.
882a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
883a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param value the result value for this task
884a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
885a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public void complete(V value) {
886a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        try {
887a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            setRawResult(value);
888a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        } catch (Throwable rex) {
889a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            setExceptionalCompletion(rex);
890a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return;
891a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
892a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        setCompletion(NORMAL);
893a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
894a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
895a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
896a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Waits if necessary for the computation to complete, and then
897a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * retrieves its result.
898a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
899a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the computed result
900a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @throws CancellationException if the computation was cancelled
901a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @throws ExecutionException if the computation threw an
902a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * exception
903a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @throws InterruptedException if the current thread is not a
904a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * member of a ForkJoinPool and was interrupted while waiting
905a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
906a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final V get() throws InterruptedException, ExecutionException {
907a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int s = (Thread.currentThread() instanceof ForkJoinWorkerThread) ?
908a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            doJoin() : externalInterruptibleAwaitDone(0L);
909a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        Throwable ex;
910a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (s == CANCELLED)
911a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            throw new CancellationException();
912a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (s == EXCEPTIONAL && (ex = getThrowableException()) != null)
913a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            throw new ExecutionException(ex);
914a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return getRawResult();
915a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
916a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
917a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
918a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Waits if necessary for at most the given time for the computation
919a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * to complete, and then retrieves its result, if available.
920a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
921a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param timeout the maximum time to wait
922a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param unit the time unit of the timeout argument
923a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the computed result
924a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @throws CancellationException if the computation was cancelled
925a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @throws ExecutionException if the computation threw an
926a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * exception
927a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @throws InterruptedException if the current thread is not a
928a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * member of a ForkJoinPool and was interrupted while waiting
929a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @throws TimeoutException if the wait timed out
930a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
931a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final V get(long timeout, TimeUnit unit)
932a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        throws InterruptedException, ExecutionException, TimeoutException {
933a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        Thread t = Thread.currentThread();
934a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (t instanceof ForkJoinWorkerThread) {
935a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            ForkJoinWorkerThread w = (ForkJoinWorkerThread) t;
936a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            long nanos = unit.toNanos(timeout);
937a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (status >= 0) {
938a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                boolean completed = false;
939a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (w.unpushTask(this)) {
940a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    try {
941a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        completed = exec();
942a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    } catch (Throwable rex) {
943a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                        setExceptionalCompletion(rex);
944a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    }
945a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                }
946a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                if (completed)
947a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    setCompletion(NORMAL);
948a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                else if (status >= 0 && nanos > 0)
949a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                    w.pool.timedAwaitJoin(this, nanos);
950a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
951a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
952a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        else {
953a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            long millis = unit.toMillis(timeout);
954a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (millis > 0)
955a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                externalInterruptibleAwaitDone(millis);
956a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
957a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        int s = status;
958a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (s != NORMAL) {
959a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            Throwable ex;
960a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (s == CANCELLED)
961a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                throw new CancellationException();
962a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (s != EXCEPTIONAL)
963a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                throw new TimeoutException();
964a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if ((ex = getThrowableException()) != null)
965a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                throw new ExecutionException(ex);
966a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
967a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return getRawResult();
968a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
969a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
970a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
971a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Joins this task, without returning its result or throwing its
972a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * exception. This method may be useful when processing
973a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * collections of tasks when some have been cancelled or otherwise
974a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * known to have aborted.
975a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
976a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final void quietlyJoin() {
977a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        doJoin();
978a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
979a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
980a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
981a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Commences performing this task and awaits its completion if
982a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * necessary, without returning its result or throwing its
983a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * exception.
984a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
985a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public final void quietlyInvoke() {
986a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        doInvoke();
987a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
988a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
989a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
990a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Possibly executes tasks until the pool hosting the current task
991a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link ForkJoinPool#isQuiescent is quiescent}. This method may
992a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * be of use in designs in which many tasks are forked, but none
993a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * are explicitly joined, instead executing them until all are
994a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * processed.
995a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
996a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be invoked only from within {@code
997a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinPool} computations (as may be determined using method
998a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #inForkJoinPool}).  Attempts to invoke in other contexts
999a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * result in exceptions or errors, possibly including {@code
1000a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ClassCastException}.
1001a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1002a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static void helpQuiesce() {
1003a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        ((ForkJoinWorkerThread) Thread.currentThread())
1004a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            .helpQuiescePool();
1005a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1006a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1007a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1008a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Resets the internal bookkeeping state of this task, allowing a
1009a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * subsequent {@code fork}. This method allows repeated reuse of
1010a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * this task, but only if reuse occurs when this task has either
1011a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * never been forked, or has been forked, then completed and all
1012a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * outstanding joins of this task have also completed. Effects
1013a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * under any other usage conditions are not guaranteed.
1014a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * This method may be useful when executing
1015a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * pre-constructed trees of subtasks in loops.
1016a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1017a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>Upon completion of this method, {@code isDone()} reports
1018a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@code false}, and {@code getException()} reports {@code
1019a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * null}. However, the value returned by {@code getRawResult} is
1020a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * unaffected. To clear this value, you can invoke {@code
1021a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * setRawResult(null)}.
1022a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1023a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public void reinitialize() {
1024a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (status == EXCEPTIONAL)
1025a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            clearExceptionalCompletion();
1026a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        else
1027a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            status = 0;
1028a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1029a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1030a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1031a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns the pool hosting the current task execution, or null
1032a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * if this task is executing outside of any ForkJoinPool.
1033a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1034a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @see #inForkJoinPool
1035a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the pool, or {@code null} if none
1036a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1037a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static ForkJoinPool getPool() {
1038a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        Thread t = Thread.currentThread();
1039a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return (t instanceof ForkJoinWorkerThread) ?
1040a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            ((ForkJoinWorkerThread) t).pool : null;
1041a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1042a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1043a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1044a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns {@code true} if the current thread is a {@link
1045a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinWorkerThread} executing as a ForkJoinPool computation.
1046a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1047a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return {@code true} if the current thread is a {@link
1048a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinWorkerThread} executing as a ForkJoinPool computation,
1049a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * or {@code false} otherwise
1050a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1051a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static boolean inForkJoinPool() {
1052a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return Thread.currentThread() instanceof ForkJoinWorkerThread;
1053a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1054a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1055a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1056a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Tries to unschedule this task for execution. This method will
1057a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * typically succeed if this task is the most recently forked task
1058a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * by the current thread, and has not commenced executing in
1059a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * another thread.  This method may be useful when arranging
1060a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * alternative local processing of tasks that could have been, but
1061a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * were not, stolen.
1062a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1063a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be invoked only from within {@code
1064a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinPool} computations (as may be determined using method
1065a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #inForkJoinPool}).  Attempts to invoke in other contexts
1066a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * result in exceptions or errors, possibly including {@code
1067a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ClassCastException}.
1068a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1069a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return {@code true} if unforked
1070a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1071a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public boolean tryUnfork() {
1072a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return ((ForkJoinWorkerThread) Thread.currentThread())
1073a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            .unpushTask(this);
1074a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1075a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1076a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1077a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns an estimate of the number of tasks that have been
1078a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * forked by the current worker thread but not yet executed. This
1079a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * value may be useful for heuristic decisions about whether to
1080a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * fork other tasks.
1081a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1082a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be invoked only from within {@code
1083a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinPool} computations (as may be determined using method
1084a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #inForkJoinPool}).  Attempts to invoke in other contexts
1085a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * result in exceptions or errors, possibly including {@code
1086a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ClassCastException}.
1087a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1088a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the number of tasks
1089a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1090a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static int getQueuedTaskCount() {
1091a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return ((ForkJoinWorkerThread) Thread.currentThread())
1092a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            .getQueueSize();
1093a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1094a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1095a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1096a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns an estimate of how many more locally queued tasks are
1097a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * held by the current worker thread than there are other worker
1098a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * threads that might steal them.  This value may be useful for
1099a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * heuristic decisions about whether to fork other tasks. In many
1100a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * usages of ForkJoinTasks, at steady state, each worker should
1101a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * aim to maintain a small constant surplus (for example, 3) of
1102a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * tasks, and to process computations locally if this threshold is
1103a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * exceeded.
1104a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1105a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be invoked only from within {@code
1106a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinPool} computations (as may be determined using method
1107a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #inForkJoinPool}).  Attempts to invoke in other contexts
1108a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * result in exceptions or errors, possibly including {@code
1109a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ClassCastException}.
1110a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1111a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the surplus number of tasks, which may be negative
1112a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1113a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static int getSurplusQueuedTaskCount() {
1114a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return ((ForkJoinWorkerThread) Thread.currentThread())
1115a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            .getEstimatedSurplusTaskCount();
1116a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1117a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1118a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    // Extension methods
1119a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1120a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1121a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns the result that would be returned by {@link #join}, even
1122a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * if this task completed abnormally, or {@code null} if this task
1123a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * is not known to have been completed.  This method is designed
1124a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * to aid debugging, as well as to support extensions. Its use in
1125a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * any other context is discouraged.
1126a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1127a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the result, or {@code null} if not completed
1128a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1129a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public abstract V getRawResult();
1130a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1131a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1132a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Forces the given value to be returned as a result.  This method
1133a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * is designed to support extensions, and should not in general be
1134a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * called otherwise.
1135a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1136a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param value the value
1137a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1138a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    protected abstract void setRawResult(V value);
1139a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1140a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1141a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Immediately performs the base action of this task.  This method
1142a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * is designed to support extensions, and should not in general be
1143a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * called otherwise. The return value controls whether this task
1144a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * is considered to be done normally. It may return false in
1145a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * asynchronous actions that require explicit invocations of
1146a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #complete} to become joinable. It may also throw an
1147a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * (unchecked) exception to indicate abnormal exit.
1148a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1149a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return {@code true} if completed normally
1150a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1151a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    protected abstract boolean exec();
1152a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1153a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1154a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns, but does not unschedule or execute, a task queued by
1155a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * the current thread but not yet executed, if one is immediately
1156a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * available. There is no guarantee that this task will actually
1157a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * be polled or executed next. Conversely, this method may return
1158a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * null even if a task exists but cannot be accessed without
1159a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * contention with other threads.  This method is designed
1160a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * primarily to support extensions, and is unlikely to be useful
1161a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * otherwise.
1162a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1163a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be invoked only from within {@code
1164a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinPool} computations (as may be determined using method
1165a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #inForkJoinPool}).  Attempts to invoke in other contexts
1166a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * result in exceptions or errors, possibly including {@code
1167a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ClassCastException}.
1168a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1169a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the next task, or {@code null} if none are available
1170a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1171a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    protected static ForkJoinTask<?> peekNextLocalTask() {
1172a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return ((ForkJoinWorkerThread) Thread.currentThread())
1173a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            .peekTask();
1174a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1175a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1176a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1177a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Unschedules and returns, without executing, the next task
1178a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * queued by the current thread but not yet executed.  This method
1179a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * is designed primarily to support extensions, and is unlikely to
1180a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * be useful otherwise.
1181a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1182a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be invoked only from within {@code
1183a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinPool} computations (as may be determined using method
1184a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #inForkJoinPool}).  Attempts to invoke in other contexts
1185a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * result in exceptions or errors, possibly including {@code
1186a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ClassCastException}.
1187a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1188a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the next task, or {@code null} if none are available
1189a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1190a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    protected static ForkJoinTask<?> pollNextLocalTask() {
1191a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return ((ForkJoinWorkerThread) Thread.currentThread())
1192a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            .pollLocalTask();
1193a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1194a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1195a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1196a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Unschedules and returns, without executing, the next task
1197a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * queued by the current thread but not yet executed, if one is
1198a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * available, or if not available, a task that was forked by some
1199a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * other thread, if available. Availability may be transient, so a
1200a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@code null} result does not necessarily imply quiescence
1201a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * of the pool this task is operating in.  This method is designed
1202a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * primarily to support extensions, and is unlikely to be useful
1203a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * otherwise.
1204a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1205a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * <p>This method may be invoked only from within {@code
1206a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ForkJoinPool} computations (as may be determined using method
1207a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * {@link #inForkJoinPool}).  Attempts to invoke in other contexts
1208a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * result in exceptions or errors, possibly including {@code
1209a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * ClassCastException}.
1210a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1211a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return a task, or {@code null} if none are available
1212a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1213a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    protected static ForkJoinTask<?> pollTask() {
1214a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return ((ForkJoinWorkerThread) Thread.currentThread())
1215a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            .pollTask();
1216a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1217a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1218a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1219a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Adaptor for Runnables. This implements RunnableFuture
1220a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * to be compliant with AbstractExecutorService constraints
1221a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * when used in ForkJoinPool.
1222a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1223a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    static final class AdaptedRunnable<T> extends ForkJoinTask<T>
1224a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        implements RunnableFuture<T> {
1225a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        final Runnable runnable;
1226a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        final T resultOnCompletion;
1227a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        T result;
1228a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        AdaptedRunnable(Runnable runnable, T result) {
1229a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (runnable == null) throw new NullPointerException();
1230a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            this.runnable = runnable;
1231a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            this.resultOnCompletion = result;
1232a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
1233a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        public T getRawResult() { return result; }
1234a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        public void setRawResult(T v) { result = v; }
1235a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        public boolean exec() {
1236a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            runnable.run();
1237a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            result = resultOnCompletion;
1238a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            return true;
1239a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
1240a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        public void run() { invoke(); }
1241a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        private static final long serialVersionUID = 5232453952276885070L;
1242a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1243a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1244a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1245a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Adaptor for Callables
1246a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1247a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    static final class AdaptedCallable<T> extends ForkJoinTask<T>
1248a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        implements RunnableFuture<T> {
1249a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        final Callable<? extends T> callable;
1250a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        T result;
1251a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        AdaptedCallable(Callable<? extends T> callable) {
1252a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            if (callable == null) throw new NullPointerException();
1253a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            this.callable = callable;
1254a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
1255a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        public T getRawResult() { return result; }
1256a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        public void setRawResult(T v) { result = v; }
1257a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        public boolean exec() {
1258a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            try {
1259a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                result = callable.call();
1260a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                return true;
1261a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            } catch (Error err) {
1262a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                throw err;
1263a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            } catch (RuntimeException rex) {
1264a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                throw rex;
1265a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            } catch (Exception ex) {
1266a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                throw new RuntimeException(ex);
1267a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            }
1268a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
1269a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        public void run() { invoke(); }
1270a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        private static final long serialVersionUID = 2838392045355241008L;
1271a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1272a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1273a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1274a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns a new {@code ForkJoinTask} that performs the {@code run}
1275a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * method of the given {@code Runnable} as its action, and returns
1276a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * a null result upon {@link #join}.
1277a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1278a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param runnable the runnable action
1279a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the task
1280a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1281a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static ForkJoinTask<?> adapt(Runnable runnable) {
1282a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return new AdaptedRunnable<Void>(runnable, null);
1283a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1284a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1285a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1286a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns a new {@code ForkJoinTask} that performs the {@code run}
1287a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * method of the given {@code Runnable} as its action, and returns
1288a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * the given result upon {@link #join}.
1289a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1290a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param runnable the runnable action
1291a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param result the result upon completion
1292a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the task
1293a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1294a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static <T> ForkJoinTask<T> adapt(Runnable runnable, T result) {
1295a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return new AdaptedRunnable<T>(runnable, result);
1296a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1297a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1298a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1299a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Returns a new {@code ForkJoinTask} that performs the {@code call}
1300a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * method of the given {@code Callable} as its action, and returns
1301a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * its result upon {@link #join}, translating any checked exceptions
1302a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * encountered into {@code RuntimeException}.
1303a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1304a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param callable the callable action
1305a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @return the task
1306a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1307a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    public static <T> ForkJoinTask<T> adapt(Callable<? extends T> callable) {
1308a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        return new AdaptedCallable<T>(callable);
1309a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1310a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1311a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    // Serialization support
1312a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1313a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final long serialVersionUID = -7721805057305804111L;
1314a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1315a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1316a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Saves the state to a stream (that is, serializes it).
1317a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1318a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @serialData the current run status and the exception thrown
1319a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * during execution, or {@code null} if none
1320a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param s the stream
1321a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1322a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private void writeObject(java.io.ObjectOutputStream s)
1323a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        throws java.io.IOException {
1324a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        s.defaultWriteObject();
1325a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        s.writeObject(getException());
1326a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1327a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1328a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    /**
1329a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * Reconstitutes the instance from a stream (that is, deserializes it).
1330a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     *
1331a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     * @param s the stream
1332a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson     */
1333a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private void readObject(java.io.ObjectInputStream s)
1334a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        throws java.io.IOException, ClassNotFoundException {
1335a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        s.defaultReadObject();
1336a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        Object ex = s.readObject();
1337a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        if (ex != null)
1338a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            setExceptionalCompletion((Throwable)ex);
1339a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1340a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1341a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    // Unsafe mechanics
1342a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final sun.misc.Unsafe UNSAFE;
1343a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    private static final long statusOffset;
1344a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    static {
1345a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        exceptionTableLock = new ReentrantLock();
1346a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        exceptionTableRefQueue = new ReferenceQueue<Object>();
1347a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        exceptionTable = new ExceptionNode[EXCEPTION_MAP_CAPACITY];
1348a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        try {
1349a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            UNSAFE = sun.misc.Unsafe.getUnsafe();
1350a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            statusOffset = UNSAFE.objectFieldOffset
1351a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson                (ForkJoinTask.class.getDeclaredField("status"));
1352a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        } catch (Exception e) {
1353a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson            throw new Error(e);
1354a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson        }
1355a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson    }
1356a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson
1357a807b4d808d2591894daf13aab179b2e9c46a2f5Jesse Wilson}
1358