From 918bb10dd47df00ec502cd0a883eabc3c2520d83 Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 16 Aug 2020 14:12:38 +0300 Subject: [PATCH 1/3] 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 b2c0eeb00ba..78dc58a63a3 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 From a0639418cbc6312df7da38ad2fb372a77eac2e6d Mon Sep 17 00:00:00 2001 From: Alex Guteniev Date: Sun, 16 Aug 2020 14:19:59 +0300 Subject: [PATCH 2/3] clang format --- stl/src/atomic.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/stl/src/atomic.cpp b/stl/src/atomic.cpp index 78dc58a63a3..433c7760687 100644 --- a/stl/src/atomic.cpp +++ b/stl/src/atomic.cpp @@ -4,6 +4,7 @@ // implement shared_ptr spin lock #include + #include namespace { From c57e2324b699d9ff076ac61eeed228a085e1a658 Mon Sep 17 00:00:00 2001 From: "Stephan T. Lavavej" Date: Sun, 16 Aug 2020 15:24:47 -0700 Subject: [PATCH 3/3] Update stl/src/atomic.cpp --- stl/src/atomic.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/stl/src/atomic.cpp b/stl/src/atomic.cpp index 433c7760687..8d1b83fc83c 100644 --- a/stl/src/atomic.cpp +++ b/stl/src/atomic.cpp @@ -14,7 +14,7 @@ namespace { _EXTERN_C -_CRTIMP2_PURE void __cdecl _Lock_shared_ptr_spin_lock() { // spin until _Shared_ptr_flag successfully set +_CRTIMP2_PURE void __cdecl _Lock_shared_ptr_spin_lock() { // TRANSITION, ABI: "spin_lock" name is outdated AcquireSRWLockExclusive(&_Shared_ptr_lock); }