8 #include <condition_variable>
10 #include <model-assert.h>
15 #define ASSERT(expr) MODEL_ASSERT(expr)
16 #define RL_ASSERT(expr) MODEL_ASSERT(expr)
19 #define RL_DELETE(expr) delete expr
21 #define mo_seqcst memory_order_relaxed
22 #define mo_release memory_order_release
23 #define mo_acquire memory_order_acquire
24 #define mo_acq_rel memory_order_acq_rel
25 #define mo_relaxed memory_order_relaxed
29 /* This 'useless' struct is declared just so we can use partial template
30 * specialization in our store and load functions. */
31 template <typename T, size_t n>
33 static void store(void *addr, T val);
34 static T load(const void *addr);
38 struct useless<T, 1> {
39 static void store(void *addr, T val) { store_8(addr, (uint8_t)val); }
40 static T load(const void *addr) { return (T)load_8(addr); }
44 struct useless<T, 2> {
45 static void store(void *addr, T val) { store_16(addr, (uint16_t)val); }
46 static T load(const void *addr) { return (T)load_16(addr); }
50 struct useless<T, 4> {
51 static void store(void *addr, T val) { store_32(addr, (uint32_t)val); }
52 static T load(const void *addr) { return (T)load_32(addr); }
56 struct useless<T, 8> {
57 static void store(void *addr, T val) { store_64(addr, (uint64_t)val); }
58 static T load(const void *addr) { return (T)load_64(addr); }
63 var() { useless<T, sizeof(T)>::store(&value, 0); }
64 var(T v) { useless<T, sizeof(T)>::store(&value, v); }
70 void operator = (T v) { useless<T, sizeof(T)>::store(&value, v); }
71 T operator () () { return useless<T, sizeof(T)>::load(&value); }
72 void operator += (T v) {
73 useless<T, sizeof(T)>::store(&value,
74 useless<T, sizeof(T)>::load(&value) + v);
76 bool operator == (const struct var<T> v) const { return useless<T, sizeof(T)>::load(&value) == useless<T, sizeof(T)>::load(&v.value); }
84 typedef int debug_info_param;
85 void yield(debug_info_param info) { }
90 typedef backoff_t backoff;
91 typedef backoff_t linear_backoff;
92 typedef backoff_t exp_backoff;
96 #endif /* __UNRELACY_H__ */