ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/jsr166e/ForkJoinTask.java
(Generate patch)

Comparing jsr166/src/jsr166e/ForkJoinTask.java (file contents):
Revision 1.13 by dl, Wed Jun 19 14:55:40 2013 UTC vs.
Revision 1.17 by jsr166, Thu Sep 3 22:54:46 2015 UTC

# Line 134 | Line 134 | import java.lang.reflect.Constructor;
134   * (DAG). Otherwise, executions may encounter a form of deadlock as
135   * tasks cyclically wait for each other.  However, this framework
136   * supports other methods and techniques (for example the use of
137 < * {@link Phaser}, {@link #helpQuiesce}, and {@link #complete}) that
137 > * {@link java.util.concurrent.Phaser Phaser}, {@link #helpQuiesce}, and {@link #complete}) that
138   * may be of use in constructing custom subclasses for problems that
139   * are not statically structured as DAGs. To support such usages, a
140   * ForkJoinTask may be atomically <em>tagged</em> with a {@code short}
# Line 411 | Line 411 | public abstract class ForkJoinTask<V> im
411          final Throwable ex;
412          ExceptionNode next;
413          final long thrower;  // use id not ref to avoid weak cycles
414 +        final int hashCode;  // store task hashCode before weak ref disappears
415          ExceptionNode(ForkJoinTask<?> task, Throwable ex, ExceptionNode next) {
416              super(task, exceptionTableRefQueue);
417              this.ex = ex;
418              this.next = next;
419              this.thrower = Thread.currentThread().getId();
420 +            this.hashCode = System.identityHashCode(task);
421          }
422      }
423  
# Line 574 | Line 576 | public abstract class ForkJoinTask<V> im
576      /**
577       * Poll stale refs and remove them. Call only while holding lock.
578       */
579 +    /**
580 +     * Poll stale refs and remove them. Call only while holding lock.
581 +     */
582      private static void expungeStaleExceptions() {
583          for (Object x; (x = exceptionTableRefQueue.poll()) != null;) {
584              if (x instanceof ExceptionNode) {
585 <                ForkJoinTask<?> key = ((ExceptionNode)x).get();
585 >                int hashCode = ((ExceptionNode)x).hashCode;
586                  ExceptionNode[] t = exceptionTable;
587 <                int i = System.identityHashCode(key) & (t.length - 1);
587 >                int i = hashCode & (t.length - 1);
588                  ExceptionNode e = t[i];
589                  ExceptionNode pred = null;
590                  while (e != null) {
# Line 782 | Line 787 | public abstract class ForkJoinTask<V> im
787       * unprocessed.
788       *
789       * @param tasks the collection of tasks
790 +     * @param <T> the type of the values returned from the tasks
791       * @return the tasks argument, to simplify usage
792       * @throws NullPointerException if tasks or any element are null
793       */
# Line 1341 | Line 1347 | public abstract class ForkJoinTask<V> im
1347      }
1348  
1349      /**
1350 <     * Adaptor for Runnables. This implements RunnableFuture
1350 >     * Adapter for Runnables. This implements RunnableFuture
1351       * to be compliant with AbstractExecutorService constraints
1352       * when used in ForkJoinPool.
1353       */
# Line 1362 | Line 1368 | public abstract class ForkJoinTask<V> im
1368      }
1369  
1370      /**
1371 <     * Adaptor for Runnables without results
1371 >     * Adapter for Runnables without results
1372       */
1373      static final class AdaptedRunnableAction extends ForkJoinTask<Void>
1374          implements RunnableFuture<Void> {
# Line 1379 | Line 1385 | public abstract class ForkJoinTask<V> im
1385      }
1386  
1387      /**
1388 <     * Adaptor for Runnables in which failure forces worker exception
1388 >     * Adapter for Runnables in which failure forces worker exception
1389       */
1390      static final class RunnableExecuteAction extends ForkJoinTask<Void> {
1391          final Runnable runnable;
# Line 1397 | Line 1403 | public abstract class ForkJoinTask<V> im
1403      }
1404  
1405      /**
1406 <     * Adaptor for Callables
1406 >     * Adapter for Callables
1407       */
1408      static final class AdaptedCallable<T> extends ForkJoinTask<T>
1409          implements RunnableFuture<T> {
# Line 1444 | Line 1450 | public abstract class ForkJoinTask<V> im
1450       *
1451       * @param runnable the runnable action
1452       * @param result the result upon completion
1453 +     * @param <T> the type of the result
1454       * @return the task
1455       */
1456      public static <T> ForkJoinTask<T> adapt(Runnable runnable, T result) {
# Line 1457 | Line 1464 | public abstract class ForkJoinTask<V> im
1464       * encountered into {@code RuntimeException}.
1465       *
1466       * @param callable the callable action
1467 +     * @param <T> the type of the callable's result
1468       * @return the task
1469       */
1470      public static <T> ForkJoinTask<T> adapt(Callable<? extends T> callable) {
# Line 1470 | Line 1478 | public abstract class ForkJoinTask<V> im
1478      /**
1479       * Saves this task to a stream (that is, serializes it).
1480       *
1481 +     * @param s the stream
1482 +     * @throws java.io.IOException if an I/O error occurs
1483       * @serialData the current run status and the exception thrown
1484       * during execution, or {@code null} if none
1485       */
# Line 1481 | Line 1491 | public abstract class ForkJoinTask<V> im
1491  
1492      /**
1493       * Reconstitutes this task from a stream (that is, deserializes it).
1494 +     * @param s the stream
1495 +     * @throws ClassNotFoundException if the class of a serialized object
1496 +     *         could not be found
1497 +     * @throws java.io.IOException if an I/O error occurs
1498       */
1499      private void readObject(java.io.ObjectInputStream s)
1500          throws java.io.IOException, ClassNotFoundException {

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines