172 |
|
|
173 |
|
/** |
174 |
|
* Maximum work-stealing queue array size. Must be less than or |
175 |
< |
* equal to 1 << 28 to ensure lack of index wraparound. (This |
176 |
< |
* is less than usual bounds, because we need leftshift by 3 |
177 |
< |
* to be in int range). |
175 |
> |
* equal to 1 << (31 - width of array entry) to ensure lack of |
176 |
> |
* index wraparound. The value is set in the static block |
177 |
> |
* at the end of this file after obtaining width. |
178 |
|
*/ |
179 |
< |
private static final int MAXIMUM_QUEUE_CAPACITY = 1 << 28; |
179 |
> |
private static final int MAXIMUM_QUEUE_CAPACITY; |
180 |
|
|
181 |
|
/** |
182 |
|
* The pool this thread works in. Accessed directly by ForkJoinTask. |
230 |
|
private static final int TRIMMED = 0x08; // killed while suspended |
231 |
|
|
232 |
|
/** |
233 |
< |
* Number of steals, transferred and reset in pool callbacks pool |
234 |
< |
* when idle Accessed directly by pool. |
233 |
> |
* Number of steals. Directly accessed (and reset) by |
234 |
> |
* pool.tryAccumulateStealCount when idle. |
235 |
|
*/ |
236 |
|
int stealCount; |
237 |
|
|
286 |
|
|
287 |
|
/** |
288 |
|
* The task currently being joined, set only when actively trying |
289 |
< |
* to helpStealer. Written only by current thread, but read by |
290 |
< |
* others. |
289 |
> |
* to help other stealers in helpJoinTask. Written only by this |
290 |
> |
* thread, but read by others. |
291 |
|
*/ |
292 |
|
private volatile ForkJoinTask<?> currentJoin; |
293 |
|
|
294 |
|
/** |
295 |
|
* The task most recently stolen from another worker (or |
296 |
< |
* submission queue). Written only by current thread, but read by |
296 |
> |
* submission queue). Written only by this thread, but read by |
297 |
|
* others. |
298 |
|
*/ |
299 |
|
private volatile ForkJoinTask<?> currentSteal; |
349 |
|
/** |
350 |
|
* Initializes internal state after construction but before |
351 |
|
* processing any tasks. If you override this method, you must |
352 |
< |
* invoke super.onStart() at the beginning of the method. |
352 |
> |
* invoke @code{super.onStart()} at the beginning of the method. |
353 |
|
* Initialization requires care: Most fields must have legal |
354 |
|
* default values, to ensure that attempted accesses from other |
355 |
|
* threads work correctly even before this thread starts |
447 |
|
} |
448 |
|
|
449 |
|
/** |
450 |
< |
* If a submission exists, try to activate and run it; |
450 |
> |
* If a submission exists, try to activate and run it. |
451 |
|
* |
452 |
|
* @return true if ran a task |
453 |
|
*/ |
454 |
|
private boolean tryExecSubmission() { |
455 |
|
ForkJoinPool p = pool; |
456 |
+ |
// This loop is needed in case attempt to activate fails, in |
457 |
+ |
// which case we only retry if there still appears to be a |
458 |
+ |
// submission. |
459 |
|
while (p.hasQueuedSubmissions()) { |
460 |
|
ForkJoinTask<?> t; int a; |
461 |
|
if (active || // inline p.tryIncrementActiveCount |
565 |
|
|
566 |
|
/** |
567 |
|
* Tries to take a task from the base of own queue. Assumes active |
568 |
< |
* status. Called only by current thread. |
568 |
> |
* status. Called only by this thread. |
569 |
|
* |
570 |
|
* @return a task, or null if none |
571 |
|
*/ |
588 |
|
|
589 |
|
/** |
590 |
|
* Returns a popped task, or null if empty. Assumes active status. |
591 |
< |
* Called only by current thread. |
591 |
> |
* Called only by this thread. |
592 |
|
*/ |
593 |
|
private ForkJoinTask<?> popTask() { |
594 |
|
ForkJoinTask<?>[] q = queue; |
612 |
|
|
613 |
|
/** |
614 |
|
* Specialized version of popTask to pop only if topmost element |
615 |
< |
* is the given task. Called only by current thread while |
613 |
< |
* active. |
615 |
> |
* is the given task. Called only by this thread while active. |
616 |
|
* |
617 |
|
* @param t the task. Caller must ensure non-null. |
618 |
|
*/ |
1057 |
|
} |
1058 |
|
|
1059 |
|
/** |
1060 |
+ |
* Implements ForJoinTask.getSurplusQueuedTaskCount(). |
1061 |
|
* Returns an estimate of the number of tasks, offset by a |
1062 |
|
* function of number of idle workers. |
1063 |
|
* |
1160 |
|
if ((s & (s-1)) != 0) |
1161 |
|
throw new Error("data type scale not a power of two"); |
1162 |
|
qShift = 31 - Integer.numberOfLeadingZeros(s); |
1163 |
+ |
MAXIMUM_QUEUE_CAPACITY = 1 << (31 - qShift); |
1164 |
|
} |
1165 |
|
|
1166 |
|
private static long objectFieldOffset(String field, Class<?> klazz) { |