ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/jsr166y/ForkJoinTask.java
Revision: 1.75
Committed: Tue Feb 22 10:50:51 2011 UTC (13 years, 2 months ago) by dl
Branch: MAIN
Changes since 1.74: +4 -1 lines
Log Message:
Fix Timeouts

File Contents

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