mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2025-12-06 16:56:45 +08:00
37 lines
1.1 KiB
C
37 lines
1.1 KiB
C
#ifndef A0_SRC_ATOMIC_H
|
||
#define A0_SRC_ATOMIC_H
|
||
|
||
#include "a0/inline.h"
|
||
|
||
#ifdef __cplusplus
|
||
extern "C" {
|
||
#endif
|
||
|
||
A0_STATIC_INLINE
|
||
void a0_barrier() {
|
||
// 'atomic_thread_fence' is not supported with ‘-fsanitize=thread’
|
||
__sync_synchronize();
|
||
}
|
||
|
||
#define a0_atomic_fetch_add(P, V) __atomic_fetch_add((P), (V), __ATOMIC_RELAXED)
|
||
#define a0_atomic_add_fetch(P, V) __atomic_add_fetch((P), (V), __ATOMIC_RELAXED)
|
||
|
||
#define a0_atomic_fetch_and(P, V) __atomic_fetch_and((P), (V), __ATOMIC_RELAXED)
|
||
#define a0_atomic_and_fetch(P, V) __atomic_and_fetch((P), (V), __ATOMIC_RELAXED)
|
||
|
||
#define a0_atomic_fetch_or(P, V) __atomic_fetch_or((P), (V), __ATOMIC_RELAXED)
|
||
#define a0_atomic_or_fetch(P, V) __atomic_or_fetch((P), (V), __ATOMIC_RELAXED)
|
||
|
||
#define a0_atomic_load(P) __atomic_load_n((P), __ATOMIC_RELAXED)
|
||
#define a0_atomic_store(P, V) __atomic_store_n((P), (V), __ATOMIC_RELAXED)
|
||
|
||
// TODO(lshamis): Switch from __sync to __atomic.
|
||
#define a0_cas_val(P, OV, NV) __sync_val_compare_and_swap((P), (OV), (NV))
|
||
#define a0_cas(P, OV, NV) __sync_bool_compare_and_swap((P), (OV), (NV))
|
||
|
||
#ifdef __cplusplus
|
||
}
|
||
#endif
|
||
|
||
#endif // A0_SRC_ATOMIC_H
|