/* * Copyright (c) 2025, Ryszard Goc * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include namespace Sync { namespace { ALWAYS_INLINE PSRWLOCK to_impl(void* ptr) { return reinterpret_cast(ptr); } } RWLock::RWLock() { static_assert(sizeof(SRWLOCK) == sizeof(m_storage)); PSRWLOCK rwlock_ptr = new (m_storage) SRWLOCK; InitializeSRWLock(rwlock_ptr); } RWLock::~RWLock() = default; bool RWLock::try_lock_read() { return TryAcquireSRWLockShared(to_impl(m_storage)); } bool RWLock::try_lock_write() { return TryAcquireSRWLockExclusive(to_impl(m_storage)); } void RWLock::lock_read() { AcquireSRWLockShared(to_impl(m_storage)); } void RWLock::lock_write() { AcquireSRWLockExclusive(to_impl(m_storage)); } void RWLock::unlock_read() { ReleaseSRWLockShared(to_impl(m_storage)); } void RWLock::unlock_write() { ReleaseSRWLockExclusive(to_impl(m_storage)); } }