--- jsr166/src/jsr166y/ForkJoinPool.java 2009/07/24 23:47:01 1.21 +++ jsr166/src/jsr166y/ForkJoinPool.java 2009/07/26 05:55:34 1.25 @@ -5,10 +5,19 @@ */ package jsr166y; -import java.util.*; + import java.util.concurrent.*; -import java.util.concurrent.locks.*; -import java.util.concurrent.atomic.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.LockSupport; +import java.util.concurrent.locks.ReentrantLock; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicLong; /** * An {@link ExecutorService} for running {@link ForkJoinTask}s. A @@ -539,6 +548,8 @@ public class ForkJoinPool extends Abstra * Common code for execute, invoke and submit */ private void doSubmit(ForkJoinTask task) { + if (task == null) + throw new NullPointerException(); if (isShutdown()) throw new RejectedExecutionException(); if (workers == null) @@ -574,7 +585,12 @@ public class ForkJoinPool extends Abstra // AbstractExecutorService methods public void execute(Runnable task) { - doSubmit(new AdaptedRunnable(task, null)); + ForkJoinTask job; + if (task instanceof ForkJoinTask) // avoid re-wrap + job = (ForkJoinTask)task; + else + job = new AdaptedRunnable(task, null); + doSubmit(job); } public ForkJoinTask submit(Callable task) { @@ -590,12 +606,30 @@ public class ForkJoinPool extends Abstra } public ForkJoinTask submit(Runnable task) { - ForkJoinTask job = new AdaptedRunnable(task, null); + ForkJoinTask job; + if (task instanceof ForkJoinTask) // avoid re-wrap + job = (ForkJoinTask)task; + else + job = new AdaptedRunnable(task, null); doSubmit(job); return job; } /** + * Submits a ForkJoinTask for execution. + * + * @param task the task to submit + * @return the task + * @throws RejectedExecutionException if the task cannot be + * scheduled for execution + * @throws NullPointerException if the task is null + */ + public ForkJoinTask submit(ForkJoinTask task) { + doSubmit(task); + return task; + } + + /** * Adaptor for Runnables. This implements RunnableFuture * to be compliant with AbstractExecutorService constraints. */ @@ -1881,15 +1915,15 @@ public class ForkJoinPool extends Abstra } private static final sun.misc.Unsafe UNSAFE = getUnsafe(); - static final long eventCountOffset = + private static final long eventCountOffset = fieldOffset("eventCount", ForkJoinPool.class); - static final long workerCountsOffset = + private static final long workerCountsOffset = fieldOffset("workerCounts", ForkJoinPool.class); - static final long runControlOffset = + private static final long runControlOffset = fieldOffset("runControl", ForkJoinPool.class); - static final long syncStackOffset = + private static final long syncStackOffset = fieldOffset("syncStack",ForkJoinPool.class); - static final long spareStackOffset = + private static final long spareStackOffset = fieldOffset("spareStack", ForkJoinPool.class); private boolean casEventCount(long cmp, long val) {