Program Listing for File spinlock_impl.h
↰ Return to documentation for file (include/embers/primitives/spinlock_impl.h
)
/* Copyright © 2020 Advanced Micro Devices, Inc. All rights reserved */
#ifndef _EMBERS_SPINLOCK_IMPL_H_
#define _EMBERS_SPINLOCK_IMPL_H_
#include <thread>
#include "embers/primitives/backoff.h"
#include "embers/primitives/spinlock.h"
namespace embers
{
template <MemoryScope scope, typename Integer, typename enable>
SpinLock<scope, Integer, enable>::SpinLock() : lock_(atomic<Integer>(static_cast<Integer>(0)))
{
}
template <MemoryScope scope, typename Integer, typename enable>
__host__ __device__ bool SpinLock<scope, Integer, enable>::TryAcquire()
{
return (lock_.fetch_add(static_cast<Integer>(1), std::memory_order_acquire) == 0);
}
template <MemoryScope scope, typename Integer, typename enable>
__host__ __device__ void SpinLock<scope, Integer, enable>::Acquire()
{
while (!TryAcquire()) backoff();
}
template <MemoryScope scope, typename Integer, typename enable>
__host__ __device__ void SpinLock<scope, Integer, enable>::Release()
{
lock_.store(static_cast<Integer>(0), std::memory_order_release);
}
} // namespace embers
#endif // _EMBERS_SPINLOCK_IMPL_H_