Built-in primop for CAS on foreign data (Addr#)?
Motivation
With large mutable pinned arrays appearing to lead to GC performance degradation (#18798), in trying to implement a concurrent mutable Bloom filter, I have to use foreign (allocated with calloc(3)) memory, but I'd also like to use CAS, which is only supported for MutableByteArray#. I expected to find this built-in, given that it would be essentially the same as caseIntArray#, only slightly simpler, by not having to add an initial offset (as in the mutable byte array case).
Proposal
Add a new primop (precise name TBD) that does what casIntArray# does, but on raw Addr# pointers to a suitably aligned block of memory.
I should note that after implementing a working prototype for 8.10, changes in the master branch indirectly led me (via atomic-primops-foreign) to bits-atomic, which seems to provide CAS via FFI for GCC-based builds.
So the case for having CAS for Addr# built-in, is perhaps that:
- Not dependent on GCC, uses the same machinery as CAS for
MutableByteArray# - No need for FFI wrappers.
- All the necessary code is basically already there—it just needs a slightly different front-end for the case where the array at hand is a raw pointer to foreign memory.
If I were to provide an implementation (with tests, ...), would there be interest in adopting such a new primop?