@@ -61,11 +61,13 @@ int utils_mutex_unlock(utils_mutex_t *mutex);
61
61
void utils_init_once (UTIL_ONCE_FLAG *flag, void (*onceCb)(void ));
62
62
63
63
#if defined(_WIN32)
64
+
64
65
static __inline unsigned char utils_lssb_index (long long value) {
65
66
unsigned long ret;
66
67
_BitScanForward64 (&ret, value);
67
68
return (unsigned char )ret;
68
69
}
70
+
69
71
static __inline unsigned char utils_mssb_index (long long value) {
70
72
unsigned long ret;
71
73
_BitScanReverse64 (&ret, value);
@@ -81,15 +83,25 @@ static __inline unsigned char utils_mssb_index(long long value) {
81
83
82
84
#define utils_atomic_store_release (object, desired ) \
83
85
InterlockedExchange64 ((LONG64 volatile *)object, (LONG64)desired)
86
+
84
87
#define utils_atomic_increment (object ) \
85
88
InterlockedIncrement64 ((LONG64 volatile *)object)
89
+
86
90
#define utils_atomic_decrement (object ) \
87
91
InterlockedDecrement64 ((LONG64 volatile *)object)
92
+
88
93
#define utils_fetch_and_add64 (ptr, value ) \
89
94
InterlockedExchangeAdd64 ((LONG64 *)(ptr), value)
90
- #else
95
+
96
+ // NOTE: windows version have different order of args
97
+ #define utils_compare_exchange (object, desired, expected ) \
98
+ InterlockedCompareExchange64 ((LONG64 volatile *)object, *expected, *desired)
99
+
100
+ #else // !defined(_WIN32)
101
+
91
102
#define utils_lssb_index (x ) ((unsigned char )__builtin_ctzll(x))
92
103
#define utils_mssb_index (x ) ((unsigned char )(63 - __builtin_clzll(x)))
104
+
93
105
#define utils_atomic_load_acquire (object, dest ) \
94
106
do { \
95
107
utils_annotate_acquire ((void *)object); \
@@ -103,12 +115,19 @@ static __inline unsigned char utils_mssb_index(long long value) {
103
115
} while (0 )
104
116
105
117
#define utils_atomic_increment (object ) \
106
- __atomic_add_fetch (object, 1 , __ATOMIC_ACQ_REL)
118
+ __atomic_add_fetch (object, 1 , memory_order_acq_rel)
119
+
107
120
#define utils_atomic_decrement (object ) \
108
- __atomic_sub_fetch (object, 1 , __ATOMIC_ACQ_REL)
109
- #define utils_fetch_and_add64 __sync_fetch_and_add
121
+ __atomic_sub_fetch (object, 1 , memory_order_acq_rel)
110
122
111
- #endif
123
+ #define utils_fetch_and_add64 (object, value ) \
124
+ __atomic_fetch_add (object, value, memory_order_acq_rel)
125
+
126
+ #define utils_compare_exchange (object, expected, desired ) \
127
+ __atomic_compare_exchange (object, expected, desired, 0 /* strong */ , \
128
+ memory_order_acq_rel, memory_order_relaxed)
129
+
130
+ #endif // !defined(_WIN32)
112
131
113
132
#ifdef __cplusplus
114
133
}
0 commit comments