Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 21 additions & 3 deletions src/c/misc_win32.h
Original file line number Diff line number Diff line change
Expand Up @@ -275,7 +275,9 @@ static int cffi_atomic_compare_exchange(void **ptr, void **expected,

static void *cffi_atomic_load(void **ptr)
{
#if defined(_M_X64) || defined(_M_IX86)
#if defined(__GNUC__) || defined(__clang__)
return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
#elif defined(_M_X64) || defined(_M_IX86)
return *(volatile void **)ptr;
#elif defined(_M_ARM64)
return (void *)__ldar64((volatile unsigned __int64 *)ptr);
Expand All @@ -286,7 +288,9 @@ static void *cffi_atomic_load(void **ptr)

static uint8_t cffi_atomic_load_uint8(uint8_t *ptr)
{
#if defined(_M_X64) || defined(_M_IX86)
#if defined(__GNUC__) || defined(__clang__)
return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
#elif defined(_M_X64) || defined(_M_IX86)
return *(volatile uint8_t *)ptr;
#elif defined(_M_ARM64)
return (uint8_t)__ldar8((volatile uint8_t *)ptr);
Expand All @@ -297,7 +301,9 @@ static uint8_t cffi_atomic_load_uint8(uint8_t *ptr)

static Py_ssize_t cffi_atomic_load_ssize(Py_ssize_t *ptr)
{
#if defined(_M_X64) || defined(_M_IX86)
#if defined(__GNUC__) || defined(__clang__)
return __atomic_load_n(ptr, __ATOMIC_SEQ_CST);
#elif defined(_M_X64) || defined(_M_IX86)
return *(volatile Py_ssize_t *)ptr;
#elif defined(_M_ARM64)
return (Py_ssize_t)__ldar64((volatile unsigned __int64 *)ptr);
Expand All @@ -308,17 +314,29 @@ static Py_ssize_t cffi_atomic_load_ssize(Py_ssize_t *ptr)

static void cffi_atomic_store_ssize(Py_ssize_t *ptr, Py_ssize_t value)
{
#if defined(__GNUC__) || defined(__clang__)
__atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
#else
_InterlockedExchangePointer(ptr, value);
#endif
}

static void cffi_atomic_store(void **ptr, void *value)
{
#if defined(__GNUC__) || defined(__clang__)
__atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
#else
_InterlockedExchangePointer(ptr, value);
#endif
}

static void cffi_atomic_store_uint8(uint8_t *ptr, uint8_t value)
{
#if defined(__GNUC__) || defined(__clang__)
__atomic_store_n(ptr, value, __ATOMIC_SEQ_CST);
#else
_InterlockedExchange8(ptr, value);
#endif
}

#endif /* CFFI_MISC_WIN32_H */
Loading