[RELEASE] Userspace RCU 0.15.2

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Mon Apr 14 11:01:26 EDT 2025


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



More information about the lttng-dev mailing list