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

Comparing jsr166/src/jsr166y/ForkJoinTask.java (file contents):
Revision 1.3 by dl, Wed Jan 7 19:12:36 2009 UTC vs.
Revision 1.5 by jsr166, Thu Mar 19 05:10:42 2009 UTC

# Line 18 | Line 18 | import java.lang.reflect.*;
18   * lighter weight than a normal thread.  Huge numbers of tasks and
19   * subtasks may be hosted by a small number of actual threads in a
20   * ForkJoinPool, at the price of some usage limitations.
21 < *
21 > *
22   * <p> A "main" ForkJoinTask begins execution when submitted to a
23   * {@link ForkJoinPool}. Once started, it will usually in turn start
24   * other subtasks.  As indicated by the name of this class, many
# Line 28 | Line 28 | import java.lang.reflect.*;
28   * of other methods that can come into play in advanced usages, as
29   * well as extension mechanics that allow support of new forms of
30   * fork/join processing.
31 < *
31 > *
32   * <p>A ForkJoinTask is a lightweight form of {@link Future}.  The
33   * efficiency of ForkJoinTasks stems from a set of restrictions (that
34   * are only partially statically enforceable) reflecting their
# Line 82 | Line 82 | import java.lang.reflect.*;
82   * instances of different task subclasses to call each others
83   * methods), some of them may only be called from within other
84   * ForkJoinTasks. Attempts to invoke them in other contexts result in
85 < * exceptions or errors including ClassCastException.
85 > * exceptions or errors possibly including ClassCastException.
86   *
87   * <p>Most base support methods are <code>final</code> because their
88   * implementations are intrinsically tied to the underlying
# Line 475 | Line 475 | public abstract class ForkJoinTask<V> im
475       * than once unless it has completed and been reinitialized.  This
476       * method may be invoked only from within ForkJoinTask
477       * computations. Attempts to invoke in other contexts result in
478 <     * exceptions or errors including ClassCastException.
478 >     * exceptions or errors possibly including ClassCastException.
479       */
480      public final void fork() {
481          ((ForkJoinWorkerThread)(Thread.currentThread())).pushTask(this);
# Line 515 | Line 515 | public abstract class ForkJoinTask<V> im
515       * both of them or an exception is encountered. This method may be
516       * invoked only from within ForkJoinTask computations. Attempts to
517       * invoke in other contexts result in exceptions or errors
518 <     * including ClassCastException.
518 >     * possibly including ClassCastException.
519       * @param t1 one task
520       * @param t2 the other task
521       * @throws NullPointerException if t1 or t2 are null
# Line 532 | Line 532 | public abstract class ForkJoinTask<V> im
532       * for all of them. If any task encounters an exception, others
533       * may be cancelled.  This method may be invoked only from within
534       * ForkJoinTask computations. Attempts to invoke in other contexts
535 <     * result in exceptions or errors including ClassCastException.
535 >     * result in exceptions or errors possibly including ClassCastException.
536       * @param tasks the array of tasks
537       * @throws NullPointerException if tasks or any element are null.
538       * @throws RuntimeException or Error if any task did so.
# Line 576 | Line 576 | public abstract class ForkJoinTask<V> im
576       * encounters an exception, others may be cancelled.  This method
577       * may be invoked only from within ForkJoinTask
578       * computations. Attempts to invoke in other contexts resul!t in
579 <     * exceptions or errors including ClassCastException.
579 >     * exceptions or errors possibly including ClassCastException.
580       * @param tasks the collection of tasks
581       * @throws NullPointerException if tasks or any element are null.
582       * @throws RuntimeException or Error if any task did so.
# Line 758 | Line 758 | public abstract class ForkJoinTask<V> im
758       * while helping. (This usually holds for pure divide-and-conquer
759       * tasks). This method may be invoked only from within
760       * ForkJoinTask computations. Attempts to invoke in other contexts
761 <     * resul!t in exceptions or errors including ClassCastException.
761 >     * resul!t in exceptions or errors possibly including ClassCastException.
762       * @return the computed result
763       */
764      public final V helpJoin() {
# Line 772 | Line 772 | public abstract class ForkJoinTask<V> im
772       * Possibly executes other tasks until this task is ready.  This
773       * method may be invoked only from within ForkJoinTask
774       * computations. Attempts to invoke in other contexts resul!t in
775 <     * exceptions or errors including ClassCastException.
775 >     * exceptions or errors possibly including ClassCastException.
776       */
777      public final void quietlyHelpJoin() {
778          if (status >= 0) {
# Line 855 | Line 855 | public abstract class ForkJoinTask<V> im
855       * alternative local processing of tasks that could have been, but
856       * were not, stolen. This method may be invoked only from within
857       * ForkJoinTask computations. Attempts to invoke in other contexts
858 <     * result in exceptions or errors including ClassCastException.
858 >     * result in exceptions or errors possibly including ClassCastException.
859       * @return true if unforked
860       */
861      public boolean tryUnfork() {
# Line 932 | Line 932 | public abstract class ForkJoinTask<V> im
932       * actually be polled or executed next.
933       * This method is designed primarily to support extensions,
934       * and is unlikely to be useful otherwise.
935 +     * This method may be invoked only from within
936 +     * ForkJoinTask computations. Attempts to invoke in other contexts
937 +     * result in exceptions or errors possibly including ClassCastException.
938       *
939       * @return the next task, or null if none are available
940       */
# Line 944 | Line 947 | public abstract class ForkJoinTask<V> im
947       * recently forked by the current thread but not yet executed.
948       * This method is designed primarily to support extensions,
949       * and is unlikely to be useful otherwise.
950 +     * This method may be invoked only from within
951 +     * ForkJoinTask computations. Attempts to invoke in other contexts
952 +     * result in exceptions or errors possibly including ClassCastException.
953       *
954       * @return the next task, or null if none are available
955       */
# Line 957 | Line 963 | public abstract class ForkJoinTask<V> im
963       * one is available, or if not available, a task that was forked
964       * by some other thread, if available. Availability may be
965       * transient, so a <code>null</code> result does not necessarily
966 <     * imply quiecence of the pool this task is operating in.
966 >     * imply quiecence of the pool this task is operating in.
967       * This method is designed primarily to support extensions,
968       * and is unlikely to be useful otherwise.
969 <     *
969 >     * This method may be invoked only from within
970 >     * ForkJoinTask computations. Attempts to invoke in other contexts
971 >     * result in exceptions or errors possibly including ClassCastException.
972 >     *
973       * @return a task, or null if none are available
974       */
975      protected static ForkJoinTask<?> pollTask() {
976          return ((ForkJoinWorkerThread)(Thread.currentThread())).
977 <            pollLocalOrStolenTask();
977 >            pollTask();
978      }
979  
980      // Serialization support
# Line 1000 | Line 1009 | public abstract class ForkJoinTask<V> im
1009      }
1010  
1011      // Temporary Unsafe mechanics for preliminary release
1012 +    private static Unsafe getUnsafe() throws Throwable {
1013 +        try {
1014 +            return Unsafe.getUnsafe();
1015 +        } catch (SecurityException se) {
1016 +            try {
1017 +                return java.security.AccessController.doPrivileged
1018 +                    (new java.security.PrivilegedExceptionAction<Unsafe>() {
1019 +                        public Unsafe run() throws Exception {
1020 +                            return getUnsafePrivileged();
1021 +                        }});
1022 +            } catch (java.security.PrivilegedActionException e) {
1023 +                throw e.getCause();
1024 +            }
1025 +        }
1026 +    }
1027 +
1028 +    private static Unsafe getUnsafePrivileged()
1029 +            throws NoSuchFieldException, IllegalAccessException {
1030 +        Field f = Unsafe.class.getDeclaredField("theUnsafe");
1031 +        f.setAccessible(true);
1032 +        return (Unsafe) f.get(null);
1033 +    }
1034 +
1035 +    private static long fieldOffset(String fieldName)
1036 +            throws NoSuchFieldException {
1037 +        return _unsafe.objectFieldOffset
1038 +            (ForkJoinTask.class.getDeclaredField(fieldName));
1039 +    }
1040  
1041      static final Unsafe _unsafe;
1042      static final long statusOffset;
1043  
1044      static {
1045          try {
1046 <            if (ForkJoinTask.class.getClassLoader() != null) {
1047 <                Field f = Unsafe.class.getDeclaredField("theUnsafe");
1048 <                f.setAccessible(true);
1049 <                _unsafe = (Unsafe)f.get(null);
1050 <            }
1014 <            else
1015 <                _unsafe = Unsafe.getUnsafe();
1016 <            statusOffset = _unsafe.objectFieldOffset
1017 <                (ForkJoinTask.class.getDeclaredField("status"));
1018 <        } catch (Exception ex) { throw new Error(ex); }
1046 >            _unsafe = getUnsafe();
1047 >            statusOffset = fieldOffset("status");
1048 >        } catch (Throwable e) {
1049 >            throw new RuntimeException("Could not initialize intrinsics", e);
1050 >        }
1051      }
1052  
1053   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines