RFR: 8372528: Unify atomic exchange and compare exchange [v2]

Axel Boldt-Christmas aboldtch at openjdk.org
Wed Nov 26 09:31:34 UTC 2025


> AtomicAccess::xchg is only required to support `4` bytes and `sizeof(intptr_t)` size.
> This restriction added a lot of extra logic to the Atomic implementation because
> we have a set of features we must support (including compare exchange) for `1`, `4` and `8` byte atomics on all platforms. We have some checks for unsupported `8` byte compare exchange (`VM_Version::supports_cx8()`), but the Atomic class does not try to handle these for generating its supported functions. On such a platform we would more than likely get a linking error.
> 
> I propose we change requirement for exchange to `1`, `4` and `8` bytes to achieve parity with compare exchange. Initially by implementing exchange via the `AtomicAccess::XchgUsingCmpxch`. And have follow up RFEs for each applicable platform where we specialize `AtomicAccess::PlatformXchg<1>`.
> 
> This enhancement both simplifies the Atomic implementation and provides exchange capabilities for types like `bool` and enums represented by a byte.
> 
> _It is a little unclear how we deal with `VM_Version::supports_cx8()`. Its existence makes it impossible to use `compare_exchange` on `int64_t` in general code. Currently the `Atomic` implementation assumes that `exchange` can always be used on `8` byte integers (at least going by the gtest). Even though `AtomicAccess` only specifies `4` bytes and the platform size. This PR changes this to `1`, `4` and `8` bytes. But not sure if the previous behaviour / implicit requirements is an oversight a similar property to `VM_Version::supports_cx8()` should apply here for `exchange`._
> 
> * Testing
>   * Extended gtest / (no other users of Atomic byte with exchange exists.
>   * GHA
>   * Running Tier 1-5 on Oracle supported platforms

Axel Boldt-Christmas has updated the pull request incrementally with one additional commit since the last revision:

  Update test/hotspot/gtest/runtime/test_atomic.cpp
  
  Co-authored-by: Stefan Karlsson <stefan.karlsson at oracle.com>

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

Changes:
  - all: https://git.openjdk.org/jdk/pull/28498/files
  - new: https://git.openjdk.org/jdk/pull/28498/files/b9b70050..31993dd8

Webrevs:
 - full: https://webrevs.openjdk.org/?repo=jdk&pr=28498&range=01
 - incr: https://webrevs.openjdk.org/?repo=jdk&pr=28498&range=00-01

  Stats: 2 lines in 1 file changed: 0 ins; 2 del; 0 mod
  Patch: https://git.openjdk.org/jdk/pull/28498.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/28498/head:pull/28498

PR: https://git.openjdk.org/jdk/pull/28498


More information about the hotspot-dev mailing list