From 918bb10dd47df00ec502cd0a883eabc3c2520d83 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 16 Aug 2020 14:12:38 +0300 Subject: [PATCH] Fix #370 --- stl/src/atomic.cpp | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/stl/src/atomic.cpp b/stl/src/atomic.cpp index b2c0eeb00b..78dc58a63a 100644 --- a/stl/src/atomic.cpp +++ b/stl/src/atomic.cpp @@ -4,33 +4,21 @@ // implement shared_ptr spin lock #include +#include -#include -#pragma warning(disable : 4793) +namespace { + // MUTEX FOR shared_ptr ATOMIC OPERATIONS + SRWLOCK _Shared_ptr_lock = SRWLOCK_INIT; +} // unnamed namespace _EXTERN_C -// SPIN LOCK FOR shared_ptr ATOMIC OPERATIONS -volatile long _Shared_ptr_flag; - _CRTIMP2_PURE void __cdecl _Lock_shared_ptr_spin_lock() { // spin until _Shared_ptr_flag successfully set -#ifdef _M_ARM - while (_InterlockedExchange_acq(&_Shared_ptr_flag, 1)) { - __yield(); - } -#else // _M_ARM - while (_interlockedbittestandset(&_Shared_ptr_flag, 0)) { // set bit 0 - } -#endif // _M_ARM + AcquireSRWLockExclusive(&_Shared_ptr_lock); } _CRTIMP2_PURE void __cdecl _Unlock_shared_ptr_spin_lock() { // release previously obtained lock -#ifdef _M_ARM - __dmb(_ARM_BARRIER_ISH); - __iso_volatile_store32(reinterpret_cast(&_Shared_ptr_flag), 0); -#else // _M_ARM - _interlockedbittestandreset(&_Shared_ptr_flag, 0); // reset bit 0 -#endif // _M_ARM + ReleaseSRWLockExclusive(&_Shared_ptr_lock); } _END_EXTERN_C