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.51 by jsr166, Mon Sep 20 20:42:37 2010 UTC vs.
Revision 1.55 by dl, Wed Nov 17 15:36:39 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() {
758          if ((runState & TERMINATING) != 0)
# 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 >            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 978 | 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 998 | Line 1000 | public class ForkJoinWorkerThread extend
1000          int n;
1001          if (joinMe.status < 0)                // already done
1002              return;
1001        if ((runState & TERMINATING) != 0) {  // cancel if shutting down
1002            joinMe.cancelIgnoringExceptions();
1003            return;
1004        }
1003          if ((ws = pool.workers) == null || (n = ws.length) <= 1)
1004              return;                           // need at least 2 workers
1005  
# Line 1014 | Line 1012 | public class ForkJoinWorkerThread extend
1012                  for (int j = 0; ; ++j) {      // search array
1013                      if (j < n) {
1014                          ForkJoinTask<?> vs;
1015 <                        if ((v = ws[j]) != null &&
1015 >                        if ((v = ws[j]) != null && v != this &&
1016                              (vs = v.currentSteal) != null) {
1017                              if (joinMe.status < 0 || task.status < 0)
1018                                  return;       // stale or done

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines