Atomic Operations

Overview

// global functions

apr_status_t
apr_atomic_init(apr_pool_t* p);

apr_uint32_t
apr_atomic_read32(volatile apr_uint32_t* mem);

void
apr_atomic_set32(
    volatile apr_uint32_t* mem,
    apr_uint32_t val
);

apr_uint32_t
apr_atomic_add32(
    volatile apr_uint32_t* mem,
    apr_uint32_t val
);

void
apr_atomic_sub32(
    volatile apr_uint32_t* mem,
    apr_uint32_t val
);

apr_uint32_t
apr_atomic_inc32(volatile apr_uint32_t* mem);

int
apr_atomic_dec32(volatile apr_uint32_t* mem);

apr_uint32_t
apr_atomic_cas32(
    volatile apr_uint32_t* mem,
    apr_uint32_t with,
    apr_uint32_t cmp
);

apr_uint32_t
apr_atomic_xchg32(
    volatile apr_uint32_t* mem,
    apr_uint32_t val
);

void*
apr_atomic_casptr(
    volatile void** mem,
    void* with,
    const void* cmp
);

void*
apr_atomic_xchgptr(
    volatile void** mem,
    void* with
);

Detailed Documentation

Global Functions

apr_status_t
apr_atomic_init(apr_pool_t* p)

this function is required on some platforms to initialize the atomic operation’s internal structures Programs do NOT need to call this directly. APR will call this automatically from apr_initialize.

Parameters:

p

pool

Returns:

APR_SUCCESS on successful completion

apr_uint32_t
apr_atomic_read32(volatile apr_uint32_t* mem)

atomically read an apr_uint32_t from memory

Parameters:

mem

the pointer

void
apr_atomic_set32(
    volatile apr_uint32_t* mem,
    apr_uint32_t val
)

atomically set an apr_uint32_t in memory

Parameters:

mem

pointer to the object

val

value that the object will assume

apr_uint32_t
apr_atomic_add32(
    volatile apr_uint32_t* mem,
    apr_uint32_t val
)

atomically add ‘val’ to an apr_uint32_t

Parameters:

mem

pointer to the object

val

amount to add

Returns:

old value pointed to by mem

void
apr_atomic_sub32(
    volatile apr_uint32_t* mem,
    apr_uint32_t val
)

atomically subtract ‘val’ from an apr_uint32_t

Parameters:

mem

pointer to the object

val

amount to subtract

apr_uint32_t
apr_atomic_inc32(volatile apr_uint32_t* mem)

atomically increment an apr_uint32_t by 1

Parameters:

mem

pointer to the object

Returns:

old value pointed to by mem

int
apr_atomic_dec32(volatile apr_uint32_t* mem)

atomically decrement an apr_uint32_t by 1

Parameters:

mem

pointer to the atomic value

Returns:

zero if the value becomes zero on decrement, otherwise non-zero

apr_uint32_t
apr_atomic_cas32(
    volatile apr_uint32_t* mem,
    apr_uint32_t with,
    apr_uint32_t cmp
)

compare an apr_uint32_t’s value with ‘cmp’. If they are the same swap the value with ‘with’

Parameters:

mem

pointer to the value

with

what to swap it with

cmp

the value to compare it to

Returns:

the old value of *mem

apr_uint32_t
apr_atomic_xchg32(
    volatile apr_uint32_t* mem,
    apr_uint32_t val
)

exchange an apr_uint32_t’s value with ‘val’.

Parameters:

mem

pointer to the value

val

what to swap it with

Returns:

the old value of *mem

void*
apr_atomic_casptr(
    volatile void** mem,
    void* with,
    const void* cmp
)

compare the pointer’s value with cmp. If they are the same swap the value with ‘with’

Parameters:

mem

pointer to the pointer

with

what to swap it with

cmp

the value to compare it to

Returns:

the old value of the pointer

void*
apr_atomic_xchgptr(
    volatile void** mem,
    void* with
)

exchange a pair of pointer values

Parameters:

mem

pointer to the pointer

with

what to swap it with

Returns:

the old value of the pointer