ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/jsr166/jsr166/src/main/java/util/concurrent/ForkJoinPool.java
(Generate patch)

Comparing jsr166/src/main/java/util/concurrent/ForkJoinPool.java (file contents):
Revision 1.189 by jsr166, Wed Jun 19 16:36:45 2013 UTC vs.
Revision 1.190 by dl, Thu Jun 20 15:06:50 2013 UTC

# Line 1844 | Line 1844 | public class ForkJoinPool extends Abstra
1844       * and run tasks within the target's computation.
1845       *
1846       * @param task the task to join
1847 +     * @param maxTasks the maximum number of other tasks to run
1848       */
1849 <    private int helpComplete(WorkQueue joiner, CountedCompleter<?> task) {
1849 >    final int helpComplete(WorkQueue joiner, CountedCompleter<?> task,
1850 >                           int maxTasks) {
1851          WorkQueue[] ws; int m;
1852          int s = 0;
1853          if ((ws = workQueues) != null && (m = ws.length - 1) >= 0 &&
# Line 1857 | Line 1859 | public class ForkJoinPool extends Abstra
1859                  WorkQueue q;
1860                  if ((s = task.status) < 0)
1861                      break;
1862 <                else if (joiner.internalPopAndExecCC(task))
1862 >                else if (joiner.internalPopAndExecCC(task)) {
1863 >                    if (--maxTasks <= 0) {
1864 >                        s = task.status;
1865 >                        break;
1866 >                    }
1867                      k = scans;
1868 +                }
1869                  else if ((s = task.status) < 0)
1870                      break;
1871 <                else if ((q = ws[j & m]) != null && q.pollAndExecCC(task))
1871 >                else if ((q = ws[j & m]) != null && q.pollAndExecCC(task)) {
1872 >                    if (--maxTasks <= 0) {
1873 >                        s = task.status;
1874 >                        break;
1875 >                    }
1876                      k = scans;
1877 +                }
1878                  else if (--k < 0) {
1879                      if (c == (c = ctl))
1880                          break;
# Line 1943 | Line 1955 | public class ForkJoinPool extends Abstra
1955              do {} while (joiner.tryRemoveAndExec(task) && // process local tasks
1956                           (s = task.status) >= 0);
1957              if (s >= 0 && (task instanceof CountedCompleter))
1958 <                s = helpComplete(joiner, (CountedCompleter<?>)task);
1958 >                s = helpComplete(joiner, (CountedCompleter<?>)task, Integer.MAX_VALUE);
1959              long cc = 0;        // for stability checks
1960              while (s >= 0 && (s = task.status) >= 0) {
1961                  if ((s = tryHelpStealer(joiner, task)) == 0 &&
# Line 1993 | Line 2005 | public class ForkJoinPool extends Abstra
2005                           (s = task.status) >= 0);
2006              if (s >= 0) {
2007                  if (task instanceof CountedCompleter)
2008 <                    helpComplete(joiner, (CountedCompleter<?>)task);
2008 >                    helpComplete(joiner, (CountedCompleter<?>)task, Integer.MAX_VALUE);
2009                  do {} while (task.status >= 0 &&
2010                               tryHelpStealer(joiner, task) > 0);
2011              }
# Line 2279 | Line 2291 | public class ForkJoinPool extends Abstra
2291          return popped;
2292      }
2293  
2294 <    final int externalHelpComplete(CountedCompleter<?> task) {
2294 >    final int externalHelpComplete(CountedCompleter<?> task, int maxTasks) {
2295          WorkQueue joiner; int m;
2296          WorkQueue[] ws = workQueues;
2297          int j = ThreadLocalRandom.getProbe();
# Line 2293 | Line 2305 | public class ForkJoinPool extends Abstra
2305                  WorkQueue q;
2306                  if ((s = task.status) < 0)
2307                      break;
2308 <                else if (joiner.externalPopAndExecCC(task))
2308 >                else if (joiner.externalPopAndExecCC(task)) {
2309 >                    if (--maxTasks <= 0) {
2310 >                        s = task.status;
2311 >                        break;
2312 >                    }
2313                      k = scans;
2314 +                }
2315                  else if ((s = task.status) < 0)
2316                      break;
2317 <                else if ((q = ws[j & m]) != null && q.pollAndExecCC(task))
2317 >                else if ((q = ws[j & m]) != null && q.pollAndExecCC(task)) {
2318 >                    if (--maxTasks <= 0) {
2319 >                        s = task.status;
2320 >                        break;
2321 >                    }
2322                      k = scans;
2323 +                }
2324                  else if (--k < 0) {
2325                      if (c == (c = ctl))
2326                          break;

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines