| #include <ros/arch/membar.h> |
| |
| /************************* |
| * From Linux commit 569dbb88e80d ("Linux 4.13") |
| * arch/x86/include/asm/barrier.h |
| * |
| * Note that their barrier() is our cmb(), but we actually have both available. |
| * barrier() comes from e.g. <linux/compiler-gcc.h>. |
| */ |
| |
| #define __smp_store_release(p, v) \ |
| do { \ |
| compiletime_assert_atomic_type(*p); \ |
| barrier(); \ |
| WRITE_ONCE(*p, v); \ |
| } while (0) |
| |
| #define __smp_load_acquire(p) \ |
| ({ \ |
| typeof(*p) ___p1 = READ_ONCE(*p); \ |
| compiletime_assert_atomic_type(*p); \ |
| barrier(); \ |
| ___p1; \ |
| }) |
| |
| /* Atomic operations are already serializing on x86 */ |
| #define __smp_mb__before_atomic() barrier() |
| #define __smp_mb__after_atomic() barrier() |
| |
| /************************* End Linux barrier.h */ |
| |
| #define smp_store_release(p, v) __smp_store_release(p, v) |
| #define smp_load_acquire(p) __smp_load_acquire(p) |
| #define smp_mb__before_atomic() __smp_mb__before_atomic() |
| #define smp_mb__after_atomic() __smp_mb__after_atomic() |
| |
| #define smp_read_barrier_depends() |