diff --git a/stl/src/atomic.cpp b/stl/src/atomic.cpp index b2c0eeb00ba..8d1b83fc83c 100644 --- a/stl/src/atomic.cpp +++ b/stl/src/atomic.cpp @@ -5,32 +5,21 @@ #include -#include -#pragma warning(disable : 4793) +#include + +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 +_CRTIMP2_PURE void __cdecl _Lock_shared_ptr_spin_lock() { // TRANSITION, ABI: "spin_lock" name is outdated + 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