Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 9 additions & 20 deletions stl/src/atomic.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,32 +5,21 @@

#include <yvals.h>

#include <intrin.h>
#pragma warning(disable : 4793)
#include <synchapi.h>

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<volatile int*>(&_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