/* * Copyright (c) 2018-2021, Andreas Kling * Copyright (c) 2021, kleines Filmröllchen * Copyright (c) 2025, Ryszard Goc * * SPDX-License-Identifier: BSD-2-Clause */ #include #include #include #include #include #include #include #include #include #include namespace Sync { namespace { ALWAYS_INLINE pthread_mutex_t* to_impl(void* ptr) { return reinterpret_cast(ptr); } } template MutexBase::~MutexBase() { int result = pthread_mutex_destroy(to_impl(m_storage)); if (result != 0) { warnln("pthread_mutex_destroy failed with: {}", Error::from_errno(result)); VERIFY_NOT_REACHED(); } } template bool MutexBase::try_lock() { int result = pthread_mutex_trylock(to_impl(m_storage)); if (result == 0) return true; if (result == EBUSY) return false; warnln("pthread_mutex_lock failed with: {}", Error::from_errno(result)); VERIFY_NOT_REACHED(); } template void MutexBase::lock() { int result = pthread_mutex_lock(to_impl(m_storage)); if (result != 0) { warnln("pthread_mutex_lock failed with: {}", Error::from_errno(result)); VERIFY_NOT_REACHED(); } } template void MutexBase::unlock() { int result = pthread_mutex_unlock(to_impl(m_storage)); if (result != 0) { warnln("pthread_mutex_unlock failed with: {}", Error::from_errno(result)); VERIFY_NOT_REACHED(); } } template MutexBase::MutexBase() { static_assert(sizeof(m_storage) == sizeof(pthread_mutex_t)); pthread_mutex_t* mutex_ptr = new (m_storage) pthread_mutex_t; pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); if constexpr (IsSame) { pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); } else { pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK); } if constexpr (IsSame) pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); int result = pthread_mutex_init(mutex_ptr, &attr); if (result != 0) { warnln("pthread_mutex_init failed with: {}", Error::from_errno(result)); VERIFY_NOT_REACHED(); } pthread_mutexattr_destroy(&attr); } template class SYNC_API MutexBase; template class SYNC_API MutexBase; template class SYNC_API MutexBase; template class SYNC_API MutexBase; }