RFR: 8373118: Test java/lang/Thread/virtual/Starvation.java timed out [v2]
Doug Lea
dl at openjdk.org
Sat Dec 13 15:29:29 UTC 2025
On Fri, 12 Dec 2025 23:05:48 GMT, Viktor Klang <vklang at openjdk.org> wrote:
>> Doug Lea has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains five additional commits since the last revision:
>>
>> - Merge branch 'openjdk:master' into JDK-8373118
>> - Address review comments
>> - signalWork diagnostic
>> - filter by index
>> - For testing
>
> src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java line 1468:
>
>> 1466: ForkJoinTask<?> t; int qcap; long qk;
>> 1467: ForkJoinTask<?>[] qa = q.array;
>> 1468: if (q.base != qbase || qa == null || (qcap = qa.length) <= 0 ||
>
> Seems like a negative array length would be problematic in general, so simplifying to a 0-check here?
>
> Suggestion:
>
> if (q.base != qbase || qa == null || (qcap = qa.length) == 0 ||
C1 used to not know that lengths are nonnegative, so I always do it this way. Probably needlessly but doesn't hurt.
> src/java.base/share/classes/java/util/concurrent/ForkJoinPool.java line 1471:
>
>> 1469: (t = (ForkJoinTask<?>)U.getReferenceAcquire(
>> 1470: qa, qk = slotOffset((qcap - 1) & qbase))) == null ||
>> 1471: q.base != qbase ||
>
> Is this (repeated) check intended? (i.e. are we worried about q.base drift between polling the array?)
Yes, needed (everywhere) to avoid bad CASes in rare cases (like array wraparound).
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/28797#discussion_r2616363243
PR Review Comment: https://git.openjdk.org/jdk/pull/28797#discussion_r2616364228
More information about the core-libs-dev
mailing list