NAME
agetl, agetv, agetp, aswapl, aswapv, aswapp, aincl, aincv, acasl, acasv, acasp, coherence – atomic operations

SYNOPSIS
#include <u.h>
#include <libc.h>
typedef struct Along Along;
typedef struct Avlong Avlong;
typedef struct Aptr Aptr;
long      agetl(Along *);
vlong     agetv(Avlong *);
void*     agetp(Aptr *);
long      aswapl(Along *, long new);
vlong     aswapv(Avlong *, vlong new);
void*     aswapp(Aptr *, void* new);
long      aincl(Along *, long);
vlong     aincv(Avlong *, vlong);
int       acasl(Along *, long old, long new);
int       acasv(Avlong *, vlong old, vlong new);
int       acasp(Aptr *, void* old, void* new);
void      coherence(void);

DESCRIPTION

These routines provide atomic operations that can be used to synchronize processes. They are sequentially consistent, that is, operations in a multi–process program are executed in some sequential order; operations in each process are executed in program order. No non–atomic operations will be re–orded to be observable before or after an atomic operation.

Agetl, agetv, and agetp perform an atomic read. Asetl, asetv, and asetp perform an atomic swap, replacing the value with new then returning the previous value. Aincl and aincv perform an atomic add, replacing the value with the sum of it and new, then returning the result.

Acasl, acasv, and acasp perform an atomic compare and swap. If the value is equal to old then it is replaced by new and the function returns 1. If not, the function returns 0.

Coherence provides only the re–ordering barrier.

SOURCE
/sys/src/libc/port/atomic.c
/sys/src/libc/port/atomic64.c
/sys/src/libc/$objtype/atomic.s
/sys/src/libc/$objtype/atomic64.s

BUGS
The vlong operations may be emulated in software and therefore must not be called from a note handler.