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

Comparing jsr166/src/jsr166y/ForkJoinWorkerThread.java (file contents):
Revision 1.50 by dl, Fri Sep 17 14:24:56 2010 UTC vs.
Revision 1.53 by dl, Sun Oct 24 19:37:26 2010 UTC

# Line 6 | Line 6
6  
7   package jsr166y;
8  
9 import java.util.concurrent.*;
10
9   import java.util.Random;
10   import java.util.Collection;
11   import java.util.concurrent.locks.LockSupport;
12 + import java.util.concurrent.RejectedExecutionException;
13  
14   /**
15   * A thread managed by a {@link ForkJoinPool}.  This class is
# Line 750 | Line 749 | public class ForkJoinWorkerThread extend
749      // Run State management
750  
751      // status check methods used mainly by ForkJoinPool
752 <    final boolean isRunning()     { return runState == 0; }
753 <    final boolean isTerminated()  { return (runState & TERMINATED) != 0; }
754 <    final boolean isSuspended()   { return (runState & SUSPENDED) != 0; }
755 <    final boolean isTrimmed()     { return (runState & TRIMMED) != 0; }
752 >    final boolean isRunning()    { return runState == 0; }
753 >    final boolean isTerminated() { return (runState & TERMINATED) != 0; }
754 >    final boolean isSuspended()  { return (runState & SUSPENDED) != 0; }
755 >    final boolean isTrimmed()    { return (runState & TRIMMED) != 0; }
756  
757 <    final boolean isTerminating() {
757 >    final boolean isTerminating() {
758          if ((runState & TERMINATING) != 0)
759              return true;
760          if (pool.isAtLeastTerminating()) { // propagate pool state
# Line 932 | Line 931 | public class ForkJoinWorkerThread extend
931       * Possibly runs some tasks and/or blocks, until task is done.
932       *
933       * @param joinMe the task to join
934 +     * @param timed true if use timed wait
935 +     * @param nanos wait time if timed
936       */
937 <    final void joinTask(ForkJoinTask<?> joinMe) {
937 >    final void joinTask(ForkJoinTask<?> joinMe, boolean timed, long nanos) {
938          // currentJoin only written by this thread; only need ordered store
939          ForkJoinTask<?> prevJoin = currentJoin;
940          UNSAFE.putOrderedObject(this, currentJoinOffset, joinMe);
941 <        if (sp != base)
942 <            localHelpJoinTask(joinMe);
943 <        if (joinMe.status >= 0)
944 <            pool.awaitJoin(joinMe, this);
941 >        if (isTerminating())                // cancel if shutting down
942 >            joinMe.cancelIgnoringExceptions();
943 >        else {
944 >            if (sp != base)
945 >                localHelpJoinTask(joinMe);
946 >            if (joinMe.status >= 0)
947 >                pool.awaitJoin(joinMe, this, timed, nanos);
948 >        }
949          UNSAFE.putOrderedObject(this, currentJoinOffset, prevJoin);
950      }
951  
# Line 978 | Line 983 | public class ForkJoinWorkerThread extend
983      }
984  
985      /**
986 <     * Unless terminating, tries to locate and help perform tasks for
987 <     * a stealer of the given task, or in turn one of its stealers.
988 <     * Traces currentSteal->currentJoin links looking for a thread
989 <     * working on a descendant of the given task and with a non-empty
990 <     * queue to steal back and execute tasks from.
986 >     * Tries to locate and help perform tasks for a stealer of the
987 >     * given task, or in turn one of its stealers.  Traces
988 >     * currentSteal->currentJoin links looking for a thread working on
989 >     * a descendant of the given task and with a non-empty queue to
990 >     * steal back and execute tasks from.
991       *
992       * The implementation is very branchy to cope with potential
993       * inconsistencies or loops encountering chains that are stale,
# Line 998 | Line 1003 | public class ForkJoinWorkerThread extend
1003          int n;
1004          if (joinMe.status < 0)                // already done
1005              return;
1001        if ((runState & TERMINATING) != 0) {  // cancel if shutting down
1002            joinMe.cancelIgnoringExceptions();
1003            return;
1004        }
1006          if ((ws = pool.workers) == null || (n = ws.length) <= 1)
1007              return;                           // need at least 2 workers
1008  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines