src/share/classes/java/util/concurrent/ForkJoinTask.java

Print this page

        

*** 462,472 **** } return s; } /** ! * Records exception and possibly propagates * * @return status on exit */ private int setExceptionalCompletion(Throwable ex) { int s = recordExceptionalCompletion(ex); --- 462,472 ---- } return s; } /** ! * Records exception and possibly propagates. * * @return status on exit */ private int setExceptionalCompletion(Throwable ex) { int s = recordExceptionalCompletion(ex);
*** 495,505 **** } } } /** ! * Removes exception node and clears status */ private void clearExceptionalCompletion() { int h = System.identityHashCode(this); final ReentrantLock lock = exceptionTableLock; lock.lock(); --- 495,505 ---- } } } /** ! * Removes exception node and clears status. */ private void clearExceptionalCompletion() { int h = System.identityHashCode(this); final ReentrantLock lock = exceptionTableLock; lock.lock();
*** 633,654 **** if (ex != null) { if (ex instanceof Error) throw (Error)ex; if (ex instanceof RuntimeException) throw (RuntimeException)ex; ! throw uncheckedThrowable(ex, RuntimeException.class); } } /** * The sneaky part of sneaky throw, relying on generics * limitations to evade compiler complaints about rethrowing * unchecked exceptions */ @SuppressWarnings("unchecked") static <T extends Throwable> ! T uncheckedThrowable(final Throwable t, final Class<T> c) { ! return (T)t; // rely on vacuous cast } /** * Throws exception, if any, associated with the given status. */ --- 633,655 ---- if (ex != null) { if (ex instanceof Error) throw (Error)ex; if (ex instanceof RuntimeException) throw (RuntimeException)ex; ! ForkJoinTask.<RuntimeException>uncheckedThrow(ex); } } /** * The sneaky part of sneaky throw, relying on generics * limitations to evade compiler complaints about rethrowing * unchecked exceptions */ @SuppressWarnings("unchecked") static <T extends Throwable> ! void uncheckedThrow(Throwable t) throws T { ! if (t != null) ! throw (T)t; // rely on vacuous cast } /** * Throws exception, if any, associated with the given status. */
*** 679,689 **** public final ForkJoinTask<V> fork() { Thread t; if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) ((ForkJoinWorkerThread)t).workQueue.push(this); else ! ForkJoinPool.commonPool.externalPush(this); return this; } /** * Returns the result of the computation when it {@link #isDone is --- 680,690 ---- public final ForkJoinTask<V> fork() { Thread t; if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) ((ForkJoinWorkerThread)t).workQueue.push(this); else ! ForkJoinPool.common.externalPush(this); return this; } /** * Returns the result of the computation when it {@link #isDone is
*** 855,865 **** * {@code cancel} method itself must not throw exceptions. * * <p>This method is designed to be invoked by <em>other</em> * tasks. To terminate the current task, you can just return or * throw an unchecked exception from its computation method, or ! * invoke {@link #completeExceptionally}. * * @param mayInterruptIfRunning this value has no effect in the * default implementation because interrupts are not used to * control cancellation. * --- 856,866 ---- * {@code cancel} method itself must not throw exceptions. * * <p>This method is designed to be invoked by <em>other</em> * tasks. To terminate the current task, you can just return or * throw an unchecked exception from its computation method, or ! * invoke {@link #completeExceptionally(Throwable)}. * * @param mayInterruptIfRunning this value has no effect in the * default implementation because interrupts are not used to * control cancellation. *
*** 1005,1016 **** public final V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { if (Thread.interrupted()) throw new InterruptedException(); // Messy in part because we measure in nanosecs, but wait in millisecs ! int s; long ns, ms; ! if ((s = status) >= 0 && (ns = unit.toNanos(timeout)) > 0L) { long deadline = System.nanoTime() + ns; ForkJoinPool p = null; ForkJoinPool.WorkQueue w = null; Thread t = Thread.currentThread(); if (t instanceof ForkJoinWorkerThread) { --- 1006,1018 ---- public final V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException { if (Thread.interrupted()) throw new InterruptedException(); // Messy in part because we measure in nanosecs, but wait in millisecs ! int s; long ms; ! long ns = unit.toNanos(timeout); ! if ((s = status) >= 0 && ns > 0L) { long deadline = System.nanoTime() + ns; ForkJoinPool p = null; ForkJoinPool.WorkQueue w = null; Thread t = Thread.currentThread(); if (t instanceof ForkJoinWorkerThread) {
*** 1102,1112 **** if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) { ForkJoinWorkerThread wt = (ForkJoinWorkerThread)t; wt.pool.helpQuiescePool(wt.workQueue); } else ! ForkJoinPool.externalHelpQuiescePool(); } /** * Resets the internal bookkeeping state of this task, allowing a * subsequent {@code fork}. This method allows repeated reuse of --- 1104,1114 ---- if ((t = Thread.currentThread()) instanceof ForkJoinWorkerThread) { ForkJoinWorkerThread wt = (ForkJoinWorkerThread)t; wt.pool.helpQuiescePool(wt.workQueue); } else ! ForkJoinPool.quiesceCommonPool(); } /** * Resets the internal bookkeeping state of this task, allowing a * subsequent {@code fork}. This method allows repeated reuse of
*** 1387,1396 **** --- 1389,1416 ---- public final void setRawResult(Void v) { } public final boolean exec() { runnable.run(); return true; } public final void run() { invoke(); } private static final long serialVersionUID = 5232453952276885070L; } + + /** + * Adaptor for Runnables in which failure forces worker exception + */ + static final class RunnableExecuteAction extends ForkJoinTask<Void> { + final Runnable runnable; + RunnableExecuteAction(Runnable runnable) { + if (runnable == null) throw new NullPointerException(); + this.runnable = runnable; + } + public final Void getRawResult() { return null; } + public final void setRawResult(Void v) { } + public final boolean exec() { runnable.run(); return true; } + void internalPropagateException(Throwable ex) { + rethrow(ex); // rethrow outside exec() catches. + } + private static final long serialVersionUID = 5232453952276885070L; + } /** * Adaptor for Callables */ static final class AdaptedCallable<T> extends ForkJoinTask<T>