Skip to content

Commit bd69b85

Browse files
authored
Fix mingw build re atomic functions (#198)
Multiple issues making the build fail: * _InterlockedExchange8 is missing in mingw-w64, filed in mingw-w64/mingw-w64#118 * cffi_atomic_store_ssize is missing casts, leading to errors * __ldar8/__ldar64 are not supported in gcc/clang Just use the builtin compiler intrinsics everywhere for GCC/Clang when targeting Windows. Same as is already done in misc_thread_posix.h See #159
1 parent bb50a2b commit bd69b85

File tree

1 file changed

+21
-3
lines changed

1 file changed

+21
-3
lines changed

src/c/misc_win32.h

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,7 +275,9 @@ static int cffi_atomic_compare_exchange(void **ptr, void **expected,
275275

276276
static void *cffi_atomic_load(void **ptr)
277277
{
278-
#if defined(_M_X64) || defined(_M_IX86)
278+
#if defined(__GNUC__) || defined(__clang__)
279+
return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
280+
#elif defined(_M_X64) || defined(_M_IX86)
279281
return *(volatile void **)ptr;
280282
#elif defined(_M_ARM64)
281283
return (void *)__ldar64((volatile unsigned __int64 *)ptr);
@@ -286,7 +288,9 @@ static void *cffi_atomic_load(void **ptr)
286288

287289
static uint8_t cffi_atomic_load_uint8(uint8_t *ptr)
288290
{
289-
#if defined(_M_X64) || defined(_M_IX86)
291+
#if defined(__GNUC__) || defined(__clang__)
292+
return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
293+
#elif defined(_M_X64) || defined(_M_IX86)
290294
return *(volatile uint8_t *)ptr;
291295
#elif defined(_M_ARM64)
292296
return (uint8_t)__ldar8((volatile uint8_t *)ptr);
@@ -297,7 +301,9 @@ static uint8_t cffi_atomic_load_uint8(uint8_t *ptr)
297301

298302
static Py_ssize_t cffi_atomic_load_ssize(Py_ssize_t *ptr)
299303
{
300-
#if defined(_M_X64) || defined(_M_IX86)
304+
#if defined(__GNUC__) || defined(__clang__)
305+
return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
306+
#elif defined(_M_X64) || defined(_M_IX86)
301307
return *(volatile Py_ssize_t *)ptr;
302308
#elif defined(_M_ARM64)
303309
return (Py_ssize_t)__ldar64((volatile unsigned __int64 *)ptr);
@@ -308,17 +314,29 @@ static Py_ssize_t cffi_atomic_load_ssize(Py_ssize_t *ptr)
308314

309315
static void cffi_atomic_store_ssize(Py_ssize_t *ptr, Py_ssize_t value)
310316
{
317+
#if defined(__GNUC__) || defined(__clang__)
318+
__atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
319+
#else
311320
_InterlockedExchangePointer(ptr, value);
321+
#endif
312322
}
313323

314324
static void cffi_atomic_store(void **ptr, void *value)
315325
{
326+
#if defined(__GNUC__) || defined(__clang__)
327+
__atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
328+
#else
316329
_InterlockedExchangePointer(ptr, value);
330+
#endif
317331
}
318332

319333
static void cffi_atomic_store_uint8(uint8_t *ptr, uint8_t value)
320334
{
335+
#if defined(__GNUC__) || defined(__clang__)
336+
__atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
337+
#else
321338
_InterlockedExchange8(ptr, value);
339+
#endif
322340
}
323341

324342
#endif /* CFFI_MISC_WIN32_H */

0 commit comments

Comments
 (0)