Program Listing for File ticketlock_impl.h
↰ Return to documentation for file (include/embers/primitives/ticketlock_impl.h
)
/* Copyright © 2020 Advanced Micro Devices, Inc. All rights reserved */
#ifndef _EMBERS_TICKET_LOCK_IMPL_H
#define _EMBERS_TICKET_LOCK_IMPL_H
#include "embers/primitives/backoff.h"
#include "embers/primitives/ticketlock.h"
namespace embers
{
template <MemoryScope scope, size_t BackoffBase>
TicketLock<scope, BackoffBase>::TicketLock()
: next_ticket_(atomic<uint32_t>(0)), now_serving_(atomic<uint32_t>(0))
{
}
template <MemoryScope scope, size_t BackoffBase>
__host__ __device__ void TicketLock<scope, BackoffBase>::Acquire() noexcept
{
auto ticket = next_ticket_.fetch_inc(std::memory_order_relaxed);
while (true) {
auto current_ticket = now_serving_.load(std::memory_order_relaxed);
if (ticket == current_ticket) {
break;
}
const auto num_before = static_cast<size_t>(ticket) - static_cast<size_t>(current_ticket);
const size_t num_waits = num_before * BackoffBase;
for (size_t wait = 0; wait < num_waits; wait++) {
backoff();
}
}
[[maybe_unused]] auto temp = now_serving_.load(std::memory_order_acquire);
}
template <MemoryScope scope, size_t BackoffBase>
__host__ __device__ void TicketLock<scope, BackoffBase>::Release() noexcept
{
now_serving_.fetch_add(1, std::memory_order_release);
}
} // namespace embers
#endif // _EMBERS_TICKET_LOCK_IMPL_H