#ifndef SOCKS_COMPILER_H_ #define SOCKS_COMPILER_H_ #define READ_ONCE(t, p) (*((const volatile t *)&(p))) #define WRITE_ONCE(t, p, v) *(volatile t *)&(p) = (v) #ifdef __cplusplus template T read_once(const volatile T *ptr) { return *ptr; } template void write_once(volatile T *ptr, T value) { *ptr = value; } #endif #undef __used #define __used __attribute__((used)) #undef __packed #define __packed __attribute__((packed)) #undef __section #define __section(name) __attribute__((section(name))) #undef __aligned #define __aligned(x) __attribute__((aligned(x))) #endif