25#if __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_ATOMICS__) && !defined(HITLS_ATOMIC_THREAD_LOCK)
27#define SAL_HAVE_C11_ATOMICS
42#if defined(SAL_HAVE_C11_ATOMICS) && defined(ATOMIC_INT_LOCK_FREE) && ATOMIC_INT_LOCK_FREE > 0 && !defined(HITLS_ATOMIC_THREAD_LOCK)
43#define SAL_USE_ATOMICS_LIB_FUNC
48static inline int BSL_SAL_AtomicUpReferences(
BSL_SAL_RefCount *references,
int *ret)
50 *ret = atomic_fetch_add_explicit(&(references->count), 1, memory_order_relaxed) + 1;
54static inline int BSL_SAL_AtomicDownReferences(
BSL_SAL_RefCount *references,
int *ret)
56 *ret = atomic_fetch_sub_explicit(&(references->count), 1, memory_order_relaxed) - 1;
58 atomic_thread_fence(memory_order_acquire);
64#elif defined(__GNUC__) && defined(__ATOMIC_RELAXED) && __GCC_ATOMIC_INT_LOCK_FREE > 0 && !defined(HITLS_ATOMIC_THREAD_LOCK)
65#define SAL_USE_ATOMICS_LIB_FUNC
70static inline int BSL_SAL_AtomicUpReferences(
BSL_SAL_RefCount *references,
int *ret)
72 *ret = __atomic_fetch_add(&(references->count), 1, __ATOMIC_RELAXED) + 1;
76static inline int BSL_SAL_AtomicDownReferences(
BSL_SAL_RefCount *references,
int *ret)
78 *ret = __atomic_fetch_sub(&(references->count), 1, __ATOMIC_RELAXED) - 1;
80 const int type = __ATOMIC_ACQUIRE;
81 __atomic_thread_fence(type);
93static inline int BSL_SAL_AtomicUpReferences(
BSL_SAL_RefCount *references,
int *ret)
95 return BSL_SAL_AtomicAdd(&(references->count), 1, ret, references->lock);
98static inline int BSL_SAL_AtomicDownReferences(
BSL_SAL_RefCount *references,
int *ret)
100 return BSL_SAL_AtomicAdd(&(references->count), -1, ret, references->lock);
104#ifdef SAL_USE_ATOMICS_LIB_FUNC
107 references->count = 1;
119 references->count = 1;
126 references->lock = NULL;
138int32_t BSL_SAL_AtomicRefUpCtrl(
BSL_SAL_RefCount *references,
void *val, uint32_t len);
#define BSL_SUCCESS
Return success
定义 bsl_errno.h:33
int32_t BSL_SAL_ThreadLockNew(BSL_SAL_ThreadLockHandle *lock)
Create a thread lock.
定义 sal_threadlock.c:39
void BSL_SAL_ThreadLockFree(BSL_SAL_ThreadLockHandle lock)
Release the thread lock.
定义 sal_threadlock.c:88
void * BSL_SAL_ThreadLockHandle
定义 bsl_sal.h:63