2121#include " utils_windows_intrin.h"
2222
2323#pragma intrinsic(_BitScanForward64)
24- #else
24+ #else /* !_WIN32 */
2525#include < pthread.h>
2626
2727#ifndef __cplusplus
@@ -37,7 +37,7 @@ using std::memory_order_release;
3737
3838#endif /* __cplusplus */
3939
40- #endif /* _WIN32 */
40+ #endif /* ! _WIN32 */
4141
4242#include " utils_common.h"
4343#include " utils_sanitizers.h"
@@ -106,29 +106,25 @@ static __inline void utils_atomic_load_acquire_u64(uint64_t *ptr,
106106 // NOTE: Windows cl complains about direct accessing 'ptr' which is next
107107 // accessed using Interlocked* functions (warning 28112 - disabled)
108108 ASSERT_IS_ALIGNED ((uintptr_t )ptr, 8 );
109+
110+ // On Windows, there is no equivalent to __atomic_load, so we use cmpxchg
111+ // with 0, 0 here. This will always return the value under the pointer
112+ // without writing anything.
109113 LONG64 ret = InterlockedCompareExchange64 ((LONG64 volatile *)ptr, 0 , 0 );
110- utils_annotate_acquire (ptr);
114+ // utils_annotate_acquire(ptr);
111115 *out = *(uint64_t *)&ret;
112116}
113117
114118static __inline void utils_atomic_load_acquire_ptr (void **ptr, void **out) {
115119 ASSERT_IS_ALIGNED ((uintptr_t )ptr, 8 );
116120 uintptr_t ret = (uintptr_t )InterlockedCompareExchangePointer (ptr, 0 , 0 );
117- utils_annotate_acquire ((void *)ptr);
121+ // utils_annotate_acquire((void *)ptr);
118122 *(uintptr_t *)out = ret;
119123}
120124
121- static __inline void utils_atomic_store_release_u64 (uint64_t *ptr,
122- uint64_t *val) {
123- ASSERT_IS_ALIGNED ((uintptr_t )ptr, 8 );
124- ASSERT_IS_ALIGNED ((uintptr_t )val, 8 );
125- utils_annotate_release (ptr);
126- InterlockedExchange64 ((LONG64 volatile *)ptr, *(LONG64 *)val);
127- }
128-
129125static __inline void utils_atomic_store_release_ptr (void **ptr, void *val) {
130126 ASSERT_IS_ALIGNED ((uintptr_t )ptr, 8 );
131- utils_annotate_release (ptr);
127+ // utils_annotate_release(ptr);
132128 InterlockedExchangePointer (ptr, val);
133129}
134130
@@ -146,14 +142,12 @@ static __inline uint64_t utils_atomic_decrement_u64(uint64_t *ptr) {
146142
147143static __inline uint64_t utils_fetch_and_add_u64 (uint64_t *ptr, uint64_t val) {
148144 ASSERT_IS_ALIGNED ((uintptr_t )ptr, 8 );
149- ASSERT_IS_ALIGNED ((uintptr_t )&val, 8 );
150145 // return the value that had previously been in *ptr
151146 return InterlockedExchangeAdd64 ((LONG64 volatile *)(ptr), val);
152147}
153148
154149static __inline uint64_t utils_fetch_and_sub_u64 (uint64_t *ptr, uint64_t val) {
155150 ASSERT_IS_ALIGNED ((uintptr_t )ptr, 8 );
156- ASSERT_IS_ALIGNED ((uintptr_t )&val, 8 );
157151 // return the value that had previously been in *ptr
158152 // NOTE: on Windows there is no *Sub* version of InterlockedExchange
159153 return InterlockedExchangeAdd64 ((LONG64 volatile *)(ptr), -(LONG64)val);
@@ -193,27 +187,19 @@ static inline void utils_atomic_load_acquire_u64(uint64_t *ptr, uint64_t *out) {
193187 ASSERT_IS_ALIGNED ((uintptr_t )ptr, 8 );
194188 ASSERT_IS_ALIGNED ((uintptr_t )out, 8 );
195189 __atomic_load (ptr, out, memory_order_acquire);
196- utils_annotate_acquire (ptr);
190+ // utils_annotate_acquire(ptr);
197191}
198192
199193static inline void utils_atomic_load_acquire_ptr (void **ptr, void **out) {
200194 ASSERT_IS_ALIGNED ((uintptr_t )ptr, 8 );
201195 ASSERT_IS_ALIGNED ((uintptr_t )out, 8 );
202- *out = (void *)__atomic_load_n ((uintptr_t *)ptr, memory_order_acquire);
203- utils_annotate_acquire ((void *)ptr);
204- }
205-
206- static inline void utils_atomic_store_release_u64 (uint64_t *ptr,
207- uint64_t *val) {
208- ASSERT_IS_ALIGNED ((uintptr_t )ptr, 8 );
209- ASSERT_IS_ALIGNED ((uintptr_t )val, 8 );
210- utils_annotate_release (ptr);
211- __atomic_store (ptr, val, memory_order_release);
196+ __atomic_load ((uintptr_t *)ptr, (uintptr_t *)out, memory_order_acquire);
197+ // utils_annotate_acquire((void *)ptr);
212198}
213199
214200static inline void utils_atomic_store_release_ptr (void **ptr, void *val) {
215201 ASSERT_IS_ALIGNED ((uintptr_t )ptr, 8 );
216- utils_annotate_release (ptr);
202+ // utils_annotate_release(ptr);
217203 __atomic_store_n ((uintptr_t *)ptr, (uintptr_t )val, memory_order_release);
218204}
219205
0 commit comments