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