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 && |
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; |
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 && |
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 |
|
} |
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(); |
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; |