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.15 by jsr166, Fri Jul 24 22:05:22 2009 UTC vs.
Revision 1.20 by jsr166, Sun Jul 26 05:55:34 2009 UTC

# Line 5 | Line 5
5   */
6  
7   package jsr166y;
8 < import java.io.Serializable;
9 < import java.util.*;
8 >
9   import java.util.concurrent.*;
10 < import java.util.concurrent.atomic.*;
11 < import sun.misc.Unsafe;
12 < import java.lang.reflect.*;
10 >
11 > import java.io.Serializable;
12 > import java.util.Collection;
13 > import java.util.Collections;
14 > import java.util.List;
15 > import java.util.Map;
16 > import java.util.WeakHashMap;
17  
18   /**
19   * Abstract base class for tasks that run within a {@link
# Line 489 | Line 492 | public abstract class ForkJoinTask<V> im
492       * computations (as may be determined using method {@link
493       * #inForkJoinPool}). Attempts to invoke in other contexts result
494       * in exceptions or errors, possibly including ClassCastException.
495 +     *
496 +     * @return <code>this</code>, to simplify usage.
497       */
498 <    public final void fork() {
498 >    public final ForkJoinTask<V> fork() {
499          ((ForkJoinWorkerThread) Thread.currentThread())
500              .pushTask(this);
501 +        return this;
502      }
503  
504      /**
# Line 600 | Line 606 | public abstract class ForkJoinTask<V> im
606       * in exceptions or errors, possibly including ClassCastException.
607       *
608       * @param tasks the collection of tasks
609 +     * @return the tasks argument, to simplify usage
610       * @throws NullPointerException if tasks or any element are null
611       * @throws RuntimeException or Error if any task did so
612       */
613 <    public static void invokeAll(Collection<? extends ForkJoinTask<?>> tasks) {
613 >    public static <T extends ForkJoinTask<?>> Collection<T> invokeAll(Collection<T> tasks) {
614          if (!(tasks instanceof List<?>)) {
615              invokeAll(tasks.toArray(new ForkJoinTask<?>[tasks.size()]));
616 <            return;
616 >            return tasks;
617          }
618          @SuppressWarnings("unchecked")
619          List<? extends ForkJoinTask<?>> ts =
# Line 641 | Line 648 | public abstract class ForkJoinTask<V> im
648          }
649          if (ex != null)
650              rethrowException(ex);
651 +        return tasks;
652      }
653  
654      /**
# Line 1031 | Line 1039 | public abstract class ForkJoinTask<V> im
1039              .pollTask();
1040      }
1041  
1042 +    // adaptors
1043 +
1044 +    /**
1045 +     * Returns a new ForkJoinTask that performs the <code>run</code>
1046 +     * method of the given Runnable as its action, and returns a null
1047 +     * result upon <code>join</code>.
1048 +     *
1049 +     * @param runnable the runnable action
1050 +     * @return the task
1051 +     */
1052 +    public static ForkJoinTask<Void> adapt(Runnable runnable) {
1053 +        return new ForkJoinPool.AdaptedRunnable<Void>(runnable, null);
1054 +    }
1055 +
1056 +    /**
1057 +     * Returns a new ForkJoinTask that performs the <code>run</code>
1058 +     * method of the given Runnable as its action, and returns the
1059 +     * given result upon <code>join</code>.
1060 +     *
1061 +     * @param runnable the runnable action
1062 +     * @param result the result upon completion
1063 +     * @return the task
1064 +     */
1065 +    public static <T> ForkJoinTask<T> adapt(Runnable runnable, T result) {
1066 +        return new ForkJoinPool.AdaptedRunnable<T>(runnable, result);
1067 +    }
1068 +
1069 +    /**
1070 +     * Returns a new ForkJoinTask that performs the <code>call</code>
1071 +     * method of the given Callable as its action, and returns its
1072 +     * result upon <code>join</code>, translating any checked
1073 +     * exceptions encountered into <code>RuntimeException<code>.
1074 +     *
1075 +     * @param callable the callable action
1076 +     * @return the task
1077 +     */
1078 +    public static <T> ForkJoinTask<T> adapt(Callable<T> callable) {
1079 +        return new ForkJoinPool.AdaptedCallable<T>(callable);
1080 +    }
1081 +
1082      // Serialization support
1083  
1084      private static final long serialVersionUID = -7721805057305804111L;
# Line 1063 | Line 1111 | public abstract class ForkJoinTask<V> im
1111              setDoneExceptionally((Throwable) ex);
1112      }
1113  
1114 <    // Temporary Unsafe mechanics for preliminary release
1115 <    private static Unsafe getUnsafe() throws Throwable {
1114 >    // Unsafe mechanics for jsr166y 3rd party package.
1115 >    private static sun.misc.Unsafe getUnsafe() {
1116          try {
1117 <            return Unsafe.getUnsafe();
1117 >            return sun.misc.Unsafe.getUnsafe();
1118          } catch (SecurityException se) {
1119              try {
1120                  return java.security.AccessController.doPrivileged
1121 <                    (new java.security.PrivilegedExceptionAction<Unsafe>() {
1122 <                        public Unsafe run() throws Exception {
1123 <                            return getUnsafePrivileged();
1121 >                    (new java.security.PrivilegedExceptionAction<sun.misc.Unsafe>() {
1122 >                        public sun.misc.Unsafe run() throws Exception {
1123 >                            return getUnsafeByReflection();
1124                          }});
1125              } catch (java.security.PrivilegedActionException e) {
1126 <                throw e.getCause();
1126 >                throw new RuntimeException("Could not initialize intrinsics",
1127 >                                           e.getCause());
1128              }
1129          }
1130      }
1131  
1132 <    private static Unsafe getUnsafePrivileged()
1132 >    private static sun.misc.Unsafe getUnsafeByReflection()
1133              throws NoSuchFieldException, IllegalAccessException {
1134 <        Field f = Unsafe.class.getDeclaredField("theUnsafe");
1134 >        java.lang.reflect.Field f =
1135 >            sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
1136          f.setAccessible(true);
1137 <        return (Unsafe) f.get(null);
1088 <    }
1089 <
1090 <    private static long fieldOffset(String fieldName)
1091 <            throws NoSuchFieldException {
1092 <        return UNSAFE.objectFieldOffset
1093 <            (ForkJoinTask.class.getDeclaredField(fieldName));
1137 >        return (sun.misc.Unsafe) f.get(null);
1138      }
1139  
1140 <    static final Unsafe UNSAFE;
1097 <    static final long statusOffset;
1098 <
1099 <    static {
1140 >    private static long fieldOffset(String fieldName, Class<?> klazz) {
1141          try {
1142 <            UNSAFE = getUnsafe();
1143 <            statusOffset = fieldOffset("status");
1144 <        } catch (Throwable e) {
1145 <            throw new RuntimeException("Could not initialize intrinsics", e);
1142 >            return UNSAFE.objectFieldOffset(klazz.getDeclaredField(fieldName));
1143 >        } catch (NoSuchFieldException e) {
1144 >            // Convert Exception to Error
1145 >            NoSuchFieldError error = new NoSuchFieldError(fieldName);
1146 >            error.initCause(e);
1147 >            throw error;
1148          }
1149      }
1150  
1151 +    private static final sun.misc.Unsafe UNSAFE = getUnsafe();
1152 +    private static final long statusOffset =
1153 +        fieldOffset("status", ForkJoinTask.class);
1154 +
1155   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines