mirror of
https://github.com/open5gs/open5gs.git
synced 2025-11-21 15:08:08 +00:00
116 lines
3.2 KiB
C
116 lines
3.2 KiB
C
#ifndef __CORE_ATOMIC_H__
|
|
#define __CORE_ATOMIC_H__
|
|
|
|
#include "core.h"
|
|
#include "core_errno.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
/**
|
|
* this function is required on some platforms to initialize the
|
|
* atomic operation's internal structures
|
|
* @param p pool
|
|
* @return APR_SUCCESS on successful completion
|
|
* @remark Programs do NOT need to call this directly. APR will call this
|
|
* automatically from apr_initialize.
|
|
* @internal
|
|
*/
|
|
CORE_DECLARE(status_t) atomic_init();
|
|
|
|
CORE_DECLARE(status_t) atomic_final();
|
|
|
|
/*
|
|
* Atomic operations on 32-bit values
|
|
* Note: Each of these functions internally implements a memory barrier
|
|
* on platforms that require it
|
|
*/
|
|
|
|
/**
|
|
* atomically read an c_uint32_t from memory
|
|
* @param mem the pointer
|
|
*/
|
|
CORE_DECLARE(c_uint32_t) atomic_read32(volatile c_uint32_t *mem);
|
|
|
|
/**
|
|
* atomically set an c_uint32_t in memory
|
|
* @param mem pointer to the object
|
|
* @param val value that the object will assume
|
|
*/
|
|
CORE_DECLARE(void) atomic_set32(volatile c_uint32_t *mem, c_uint32_t val);
|
|
|
|
/**
|
|
* atomically add 'val' to an c_uint32_t
|
|
* @param mem pointer to the object
|
|
* @param val amount to add
|
|
* @return old value pointed to by mem
|
|
*/
|
|
CORE_DECLARE(c_uint32_t) atomic_add32(volatile c_uint32_t *mem, c_uint32_t val);
|
|
|
|
/**
|
|
* atomically subtract 'val' from an c_uint32_t
|
|
* @param mem pointer to the object
|
|
* @param val amount to subtract
|
|
*/
|
|
CORE_DECLARE(void) atomic_sub32(volatile c_uint32_t *mem, c_uint32_t val);
|
|
|
|
/**
|
|
* atomically increment an c_uint32_t by 1
|
|
* @param mem pointer to the object
|
|
* @return old value pointed to by mem
|
|
*/
|
|
CORE_DECLARE(c_uint32_t) atomic_inc32(volatile c_uint32_t *mem);
|
|
|
|
/**
|
|
* atomically decrement an c_uint32_t by 1
|
|
* @param mem pointer to the atomic value
|
|
* @return zero if the value becomes zero on decrement, otherwise non-zero
|
|
*/
|
|
CORE_DECLARE(int) atomic_dec32(volatile c_uint32_t *mem);
|
|
|
|
/**
|
|
* compare an c_uint32_t's value with 'cmp'.
|
|
* If they are the same swap the value with 'with'
|
|
* @param mem pointer to the value
|
|
* @param with what to swap it with
|
|
* @param cmp the value to compare it to
|
|
* @return the old value of *mem
|
|
*/
|
|
CORE_DECLARE(c_uint32_t) atomic_cas32(volatile c_uint32_t *mem, c_uint32_t with,
|
|
c_uint32_t cmp);
|
|
|
|
/**
|
|
* exchange an c_uint32_t's value with 'val'.
|
|
* @param mem pointer to the value
|
|
* @param val what to swap it with
|
|
* @return the old value of *mem
|
|
*/
|
|
CORE_DECLARE(c_uint32_t) atomic_xchg32(volatile c_uint32_t *mem,
|
|
c_uint32_t val);
|
|
|
|
/**
|
|
* compare the pointer's value with cmp.
|
|
* If they are the same swap the value with 'with'
|
|
* @param mem pointer to the pointer
|
|
* @param with what to swap it with
|
|
* @param cmp the value to compare it to
|
|
* @return the old value of the pointer
|
|
*/
|
|
CORE_DECLARE(void*) atomic_casptr(void *volatile *mem, void *with,
|
|
const void *cmp);
|
|
|
|
/**
|
|
* exchange a pair of pointer values
|
|
* @param mem pointer to the pointer
|
|
* @param with what to swap it with
|
|
* @return the old value of the pointer
|
|
*/
|
|
CORE_DECLARE(void*) atomic_xchgptr(void *volatile *mem, void *with);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif /* __cplusplus */
|
|
|
|
#endif /* !__CORE_ATOMIC_H__ */
|