On GCC compatible compilers, use a store with release semantics; this generates more efficient code than a full InterlockedExchangePointer.
This avoids hangs in some cases, on aarch64. Signed-off-by: Martin Storsjö <[email protected]> --- mingw-w64-libraries/winpthreads/src/spinlock.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mingw-w64-libraries/winpthreads/src/spinlock.c b/mingw-w64-libraries/winpthreads/src/spinlock.c index eb21509d6..d5efe138f 100644 --- a/mingw-w64-libraries/winpthreads/src/spinlock.c +++ b/mingw-w64-libraries/winpthreads/src/spinlock.c @@ -77,6 +77,10 @@ int pthread_spin_unlock (pthread_spinlock_t *lock) { volatile spinlock_word_t *lk = (volatile spinlock_word_t *)lock; - *lk = -1; +#if defined(__GNUC__) || defined(__clang__) + __atomic_store_n(lk, -1, __ATOMIC_RELEASE); +#else + InterlockedExchangePointer((PVOID volatile *)lk, (void*)-1); +#endif return 0; } -- 2.43.0 _______________________________________________ Mingw-w64-public mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/mingw-w64-public
