Hi,
This is a release announcement of Userspace RCU v0.15.2. The
most noteworthy changes in this stable release are:
* Tree-wide: Rename uatomic and CMM_*_SHARED callers to
uatomic_load/uatomic_store
This change renames all the following callers to uatomic_load()
(implicitly relaxed):
- CMM_LOAD_SHARED(),
- _CMM_LOAD_SHARED(),
- uatomic_read(),
- uatomic_load with explicit CMM_RELAXED.
It also renames all the following callers to uatomic_store()
(implicitly relaxed):
- CMM_STORE_SHARED(),
- _CMM_STORE_SHARED(),
- uatomic_set(),
- uatomic_store with explicit CMM_RELAXED.
This will allow moving the CMM_{LOAD,STORE}_SHARED() API back to a
volatile access, which is relevant in cases where it would be used
on data type sizes not supported by C11 atomics.
* Reintroduce read barrier depends in rcu_dereference on Alpha
for URCU_DEREFERENCE_USE_VOLATILE build.
* Use uatomic_load CMM_RELAXED when building with URCU_DEREFERENCE_USE_VOLATILE
This makes URCU_DEREFERENCE_USE_VOLATILE mark the rcu_dereference
memory read as atomic, which helps ThreadSanitizer not flag this
as a data race.
* Add cmm_annotate_mem_acquire() to URCU_DEREFERENCE_USE_VOLATILE
rcu_dereference
This explicit dependency makes ThreadSanitizer understand the
happen-before relationship implied by the rcu_dereference
address dependency with URCU_DEREFERENCE_USE_VOLATILE.
* Move back CMM_{LOAD,STORE}_SHARED to volatile access
The CMM_{LOAD,STORE}_SHARED() API is intended to be usable on types that
are not necessarily supported by atomic operations on all platforms.
Move it back to a volatile access, all call sites both internal and in
the public headers that required ThreadSanitizer support were moved to
uatomic_load/store in 4d197dd19c44 ("Tree-wide: Rename to
uatomic_load/uatomic_store").
* Only define UATOMIC_HAS_ATOMIC_BYTE and UATOMIC_HAS_ATOMIC_SHORT when the
builtin atomics support those as lock-free atomics.
* Introduce static size assertions for uatomic checks
Move away from linker tricks for validation of uatomic API usage, and
use static assertions instead, which fails at compilation with a clearer
error message, and does not depend on compiling the code with
optimizations.
This introduces type size validation across the uatomic API, including
loads and stores, thus preventing the need to link against libatomic
for atomic builtin operations performed on types which are not
lock-free on the architecture.
* Introduce UATOMIC_HAS_ATOMIC_INT/LLONG macros for various architectures.
liburcu is a LGPLv2.1 userspace RCU (read-copy-update) library. This
data synchronization library provides read-side access which scales
linearly with the number of cores. It does so by allowing multiple
copies of a given data structure to live at the same time, and by
monitoring the data structure accesses to detect grace periods after
which memory reclamation is possible.
liburcu-cds provides efficient data structures based on RCU and
lock-free algorithms. Those structures include hash tables, queues,
stacks, and doubly-linked lists.
Changelog:
2025-04-14 Userspace RCU 0.15.2
* fix: __atomic_always_lock_free() not a constant expression on g++ <
5.1
* fix: urcu assert fallback for pre-C11 builds
* doc: update uatomic-api for static assert
* Add uatomic size static assert for 's390'
* Add uatomic size static assert for 'sparc64'
* Add uatomic size static assert for 'ppc'
* Add uatomic size static assert for 'x86'
* Add uatomic size static assert for 'generic'
* Add uatomic size static assert
* Use UATOMIC_HAS_ATOMIC_INT/LLONG in generic implementation
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for x86
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for tile
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for sparc64
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for s390
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for riscv
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for ppc
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for nios2
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for mips
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for m68k
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for loongarch
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for ia64
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for hppa
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for 'gcc' arch
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for arm
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for alpha
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for aarch64
* Add UATOMIC_HAS_ATOMIC_INT/LLONG for atomic builtins
* Add builtin atomics size static asserts
* cleanup: use URCU_GCC_VERSION from compiler.h
* fix: atomic builtins defines for type support
* Move back CMM_LOAD/STORE_SHARED to volatile access
* Add cmm_annotate_mem_acquire() to URCU_DEREFERENCE_USE_VOLATILE
rcu_dereference
* Use uatomic_load CMM_RELAXED in URCU_DEREFERENCE_USE_VOLATILE
* Fix: Re-introduce URCU_DEREFERENCE_USE_VOLATILE read barrier depends
for alpha
* Tree-wide: Rename to uatomic_load/uatomic_store
* src: Use __*__ for attribute names
* API: Use __*__ for attribute names
* Fix Changelog 0.15.1 date
Project website: https://liburcu.org
Git repository: git://git.liburcu.org/urcu.git
Thanks,
Mathieu
--
Mathieu Desnoyers
EfficiOS Inc.
https://www.efficios.com