Minix Man Pages

Man Page or Keyword Search:
Man Architecture
Apropos Keyword Search (all sections) Output format
home | help
ATOMIC_CAS(3)            BSD Library Functions Manual            ATOMIC_CAS(3)

NAME
     atomic_cas, atomic_cas_32, atomic_cas_uint, atomic_cas_ulong,
     atomic_cas_ptr, atomic_cas_64, atomic_cas_32_ni, atomic_cas_uint_ni,
     atomic_cas_ulong_ni, atomic_cas_ptr_ni, atomic_cas_64_ni -- atomic
     compare-and-swap operations

SYNOPSIS
     #include <sys/atomic.h>

     uint32_t
     atomic_cas_32(volatile uint32_t *ptr, uint32_t old, uint32_t new);

     unsigned int
     atomic_cas_uint(volatile unsigned int *ptr, unsigned int old,
         unsigned int new);

     unsigned long
     atomic_cas_ulong(volatile unsigned long *ptr, unsigned long old,
         unsigned long new);

     void *
     atomic_cas_ptr(volatile void *ptr, void *old, void *new);

     uint64_t
     atomic_cas_64(volatile uint64_t *ptr, uint64_t old, uint64_t new);

     uint32_t
     atomic_cas_32_ni(volatile uint32_t *ptr, uint32_t old, uint32_t new);

     unsigned int
     atomic_cas_uint_ni(volatile unsigned int *ptr, unsigned int old,
         unsigned int new);

     unsigned long
     atomic_cas_ulong_ni(volatile unsigned long *ptr, unsigned long old,
         unsigned long new);

     void *
     atomic_cas_ptr_ni(volatile void *ptr, void *old, void *new);

     uint64_t
     atomic_cas_64_ni(volatile uint64_t *ptr, uint64_t old, uint64_t new);

DESCRIPTION
     The atomic_cas family of functions perform a compare-and-swap operation
     in an atomic fashion.  The value of the variable referenced by ptr is
     compared against old.  If the values are equal, new is stored in the
     variable referenced by ptr.

     The old value of the variable referenced by ptr is always returned
     regardless of whether or not the new value was stored.  Applications can
     test for success of the operation by comparing the return value to the
     value passed as old; if they are equal then the new value was stored.

     The non-interlocked variants, *_ni(), guarantee atomicity within the same
     CPU with respect to interrupts and preemption.  For example, they are
     suitable for synchronizing compare-and-swap operations on a variable
     shared by a thread and an interrupt that are bound to the same CPU.  The
     *_ni() variants are not atomic with respect to different CPUs.  *_ni()
     variants should avoid the interprocessor synchronization overhead of the
     standard compare-and-swap operations.

     The 64-bit variants of these functions are available only on platforms
     that can support atomic 64-bit memory access.  Applications can check for
     the availability of 64-bit atomic memory operations by testing if the
     pre-processor macro __HAVE_ATOMIC64_OPS is defined.

SEE ALSO
     atomic_ops(3)

HISTORY
     The atomic_cas functions first appeared in NetBSD 5.0.

NOTES
     On some architectures, a *_ni() variant is merely an alias for the
     corresponding standard compare-and-swap operation.  While the non-
     interlocked variant behaves correctly on those architectures, it does not
     avoid the interprocessor synchronization overhead.

BSD                            February 11, 2010                           BSD

NAME | SYNOPSIS | DESCRIPTION | SEE ALSO | HISTORY | NOTES