#ifndef LIBURING_BARRIER_H
#define LIBURING_BARRIER_H
#define io_uring_barrier() __asm__ __volatile__("": : :"memory")
#define IO_URING_WRITE_ONCE(var, val) \
(*((volatile __typeof(val) *)(&(var))) = (val))
#define IO_URING_READ_ONCE(var) (*((volatile __typeof(var) *)(&(var))))
#if defined(__x86_64__) || defined(__i386__)
#define io_uring_mb() asm volatile("mfence" ::: "memory")
#define io_uring_rmb() asm volatile("lfence" ::: "memory")
#define io_uring_wmb() asm volatile("sfence" ::: "memory")
#define io_uring_smp_rmb() io_uring_barrier()
#define io_uring_smp_wmb() io_uring_barrier()
#if defined(__i386__)
#define io_uring_smp_mb() asm volatile("lock; addl $0,0(%%esp)" \
::: "memory", "cc")
#else
#define io_uring_smp_mb() asm volatile("lock; addl $0,-132(%%rsp)" \
::: "memory", "cc")
#endif
#define io_uring_smp_store_release(p, v) \
do { \
io_uring_barrier(); \
IO_URING_WRITE_ONCE(*(p), (v)); \
} while (0)
#define io_uring_smp_load_acquire(p) \
({ \
__typeof(*p) ___p1 = IO_URING_READ_ONCE(*(p)); \
io_uring_barrier(); \
___p1; \
})
#elif defined(__aarch64__)
#define io_uring_dmb(opt) asm volatile("dmb " #opt : : : "memory")
#define io_uring_dsb(opt) asm volatile("dsb " #opt : : : "memory")
#define io_uring_mb() io_uring_dsb(sy)
#define io_uring_rmb() io_uring_dsb(ld)
#define io_uring_wmb() io_uring_dsb(st)
#define io_uring_smp_mb() io_uring_dmb(ish)
#define io_uring_smp_rmb() io_uring_dmb(ishld)
#define io_uring_smp_wmb() io_uring_dmb(ishst)
#else
#define io_uring_smp_rmb() __sync_synchronize()
#define io_uring_smp_wmb() __sync_synchronize()
#endif
#ifndef io_uring_smp_store_release
#define io_uring_smp_store_release(p, v) \
do { \
io_uring_smp_mb(); \
IO_URING_WRITE_ONCE(*p, v); \
} while (0)
#endif
#ifndef io_uring_smp_load_acquire
#define io_uring_smp_load_acquire(p) \
({ \
__typeof(*p) ___p1 = IO_URING_READ_ONCE(*p); \
io_uring_smp_mb(); \
___p1; \
})
#endif
#endif