34 #ifndef GRPC_SUPPORT_ATM_GCC_SYNC_H
35 #define GRPC_SUPPORT_ATM_GCC_SYNC_H
39 #include <grpc/support/port_platform.h>
41 typedef gpr_intptr gpr_atm;
43 #define GPR_ATM_COMPILE_BARRIER_() __asm__ __volatile__("" : : : "memory")
45 #if defined(__i386) || defined(__x86_64__)
47 #define GPR_ATM_LS_BARRIER_() GPR_ATM_COMPILE_BARRIER_()
49 #define GPR_ATM_LS_BARRIER_() gpr_atm_full_barrier()
52 #define gpr_atm_full_barrier() (__sync_synchronize())
54 static __inline gpr_atm gpr_atm_acq_load(
const gpr_atm *p) {
56 GPR_ATM_LS_BARRIER_();
60 static __inline gpr_atm gpr_atm_no_barrier_load(
const gpr_atm *p) {
62 GPR_ATM_COMPILE_BARRIER_();
66 static __inline
void gpr_atm_rel_store(gpr_atm *p, gpr_atm value) {
67 GPR_ATM_LS_BARRIER_();
71 #undef GPR_ATM_LS_BARRIER_
72 #undef GPR_ATM_COMPILE_BARRIER_
74 #define gpr_atm_no_barrier_fetch_add(p, delta) \
75 gpr_atm_full_fetch_add((p), (delta))
76 #define gpr_atm_full_fetch_add(p, delta) (__sync_fetch_and_add((p), (delta)))
78 #define gpr_atm_no_barrier_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n))
79 #define gpr_atm_acq_cas(p, o, n) (__sync_bool_compare_and_swap((p), (o), (n)))
80 #define gpr_atm_rel_cas(p, o, n) gpr_atm_acq_cas((p), (o), (n))