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