RFR: 8351933: Inaccurate masking of TC subfield decrement in ForkJoinPool

Chen Liang liach at openjdk.org
Mon Mar 17 14:45:58 UTC 2025


On Thu, 13 Mar 2025 13:34:51 GMT, Dmitry Chuyko <dchuyko at openjdk.org> wrote:

> Please review a tiny fix in the ForkJoinPool. Since JDK 9 (JDK-8134852 [1]) in one case when TC subfield in ctl field is decremented, the applied masking (UMASK, upper bits) may not preserve neighbor RC subfield sometimes. In JDKs prior to 19 FJP may stop executing tasks, which requires a long running application restart [2]. Since 19 it is even harder to reproduce because of the separate parallelism field.
> 
> The fix is to replace 'UMASK & (c - TC_UNIT)'  with '(c & RC_MASK) | ((c - TC_UNIT)  & TC_MASK)' which preserves the RC part of the compareAndSetCtl() candidate argument. On 17u and 11u that repairs known tests and applications. This PR is for the mainline, and I intend to backport it to 21u, 17u and 11u.
> 
> [1] https://bugs.openjdk.org/browse/JDK-8134852
> [2] https://bugs.openjdk.org/browse/JDK-8330017

It seems this is an overflow for the TC part of the flag. The RC part seems to be able to overflow too, but because it occupies the higher bits its overflow will never affect the TC. And this is the only site where TC is masked with `UMASK` after overflow-capable addition. Should we reexamine all uses of `UMASK` to mask only RC/TC explicitly?

-------------

PR Comment: https://git.openjdk.org/jdk/pull/24034#issuecomment-2729780512


More information about the core-libs-dev mailing list