RFR: 8293117: Add atomic bitset functions

Kim Barrett kbarrett at openjdk.org
Fri Apr 28 07:33:23 UTC 2023


Please review this change that adds and/or/xor bitops to Atomic.

Some offline discussion reached consensus on the following API (with T being a
template parameter that must be an integral type):
  T fetch_then_and(volatile T* dest, T bits, atomic_memory_order order)
  T fetch_then_or(volatile T* dest, T bits, atomic_memory_order order)
  T fetch_then_xor(volatile T* dest, T bits, atomic_memory_order order)
  T and_then_fetch(volatile T* dest, T bits, atomic_memory_order order)
  T or_then_fetch(volatile T* dest, T bits, atomic_memory_order order)
  T xor_then_fetch(volatile T* dest, T bits, atomic_memory_order order)
with order defaulting to memory_order_conservative.

I'm hoping there won't be more bike-shedding on the names.

This naming convention differs from what exists for add/sub, where we have
fetch_and_add, add_and_fetch, and the like.  fetch_and_and and and_and_fetch
just looked too weird.  For consistency we should probably rename the add/sub
operations to use "then".

A default implementation is provided, using a CAS loop for all operations.
That implementation can be overridden on a per-platform basis.  Currently
there aren't any platform-specific implementations; such will be added by
followup RFEs.  We'll want to override for most (if not all) platforms, since
the CAS loop implementation is generally less than optimal (in some cases
rather comically so).

For some platforms a CAS loop is necessary to obtain either the old or the new
value, but have a better implementation available if neither value is needed.
However, we can't easily make use of such.  We would need to either add
functions returning void to the API or change the API to return expression
templates so we can detect how the result is used.  However, we may be able to
use compiler intrinsics for some platforms, which may be able to specialize
for the usage context.  If that turns out to be a problem then we can expand
the API accordingly later.

Testing:
mach5 tier1, including new gtests for the new functionality.

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

Commit messages:
 - default atomic bitops

Changes: https://git.openjdk.org/jdk/pull/13711/files
 Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=13711&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8293117
  Stats: 302 lines in 2 files changed: 301 ins; 0 del; 1 mod
  Patch: https://git.openjdk.org/jdk/pull/13711.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/13711/head:pull/13711

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


More information about the hotspot-runtime-dev mailing list