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.49 by dl, Mon Sep 13 09:53:19 2010 UTC vs.
Revision 1.54 by dl, Wed Nov 17 12:06:46 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 isTerminating() { return (runState & TERMINATING) != 0; }
754 <    final boolean isTerminated()  { return (runState & TERMINATED) != 0; }
755 <    final boolean isSuspended()   { return (runState & SUSPENDED) != 0; }
756 <    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() {
758 >        if ((runState & TERMINATING) != 0)
759 >            return true;
760 >        if (pool.isAtLeastTerminating()) { // propagate pool state
761 >            shutdown();
762 >            return true;
763 >        }
764 >        return false;
765 >    }
766  
767      /**
768       * Sets state to TERMINATING. Does NOT unpark or interrupt
# Line 923 | 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 >            pool.awaitJoin(joinMe, this, timed, nanos);
945          UNSAFE.putOrderedObject(this, currentJoinOffset, prevJoin);
946      }
947  
948      /**
949       * Run tasks in local queue until given task is done.
950 +     * Not currently used because it complicates semantics.
951       *
952       * @param joinMe the task to join
953       */
# Line 969 | Line 980 | public class ForkJoinWorkerThread extend
980      }
981  
982      /**
983 <     * Unless terminating, tries to locate and help perform tasks for
984 <     * a stealer of the given task, or in turn one of its stealers.
985 <     * Traces currentSteal->currentJoin links looking for a thread
986 <     * working on a descendant of the given task and with a non-empty
987 <     * queue to steal back and execute tasks from.
983 >     * Tries to locate and help perform tasks for a stealer of the
984 >     * given task, or in turn one of its stealers.  Traces
985 >     * currentSteal->currentJoin links looking for a thread working on
986 >     * a descendant of the given task and with a non-empty queue to
987 >     * steal back and execute tasks from.
988       *
989       * The implementation is very branchy to cope with potential
990       * inconsistencies or loops encountering chains that are stale,
# Line 989 | Line 1000 | public class ForkJoinWorkerThread extend
1000          int n;
1001          if (joinMe.status < 0)                // already done
1002              return;
992        if ((runState & TERMINATING) != 0) {  // cancel if shutting down
993            joinMe.cancelIgnoringExceptions();
994            return;
995        }
1003          if ((ws = pool.workers) == null || (n = ws.length) <= 1)
1004              return;                           // need at least 2 workers
1005  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines