1/* @title: Compiler Atomics, Volatile Access & Fences */
2#pragma once
3#include <stdbool.h>
4#include <stddef.h>
5#include <stdint.h>
6
7#define ca_read_once(x) (*(const volatile typeof(x) *) &(x))
8
9#define ca_write_once(x, val) \
10 do { \
11 *(volatile typeof(x) *) &(x) = (val); \
12 } while (0)
13
14/* Compiler optimization barrier */
15#define ca_barrier() asm volatile("" ::: "memory")
16
17#define ca_mb() __atomic_thread_fence(__ATOMIC_SEQ_CST)
18#define ca_rmb() __atomic_thread_fence(__ATOMIC_ACQUIRE)
19#define ca_wmb() __atomic_thread_fence(__ATOMIC_RELEASE)
20
21#if defined(__x86_64__) || defined(__i386__)
22#define ca_pause() asm volatile("pause" ::: "memory")
23#elif defined(__aarch64__)
24#define ca_pause() asm volatile("isb" ::: "memory")
25#else
26#define ca_pause() ca_barrier()
27#endif
28