/* * Copyright (c) 2018-2021, Andreas Kling * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include namespace Threading { class Mutex { public: Mutex() { #ifndef __serenity__ pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); pthread_mutex_init(&m_mutex, &attr); #endif } ~Mutex() { } void lock(); void unlock(); private: #ifdef __serenity__ pthread_mutex_t m_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; #else pthread_mutex_t m_mutex; #endif }; class MutexLocker { public: ALWAYS_INLINE explicit MutexLocker(Mutex& mutex) : m_mutex(mutex) { lock(); } ALWAYS_INLINE ~MutexLocker() { unlock(); } ALWAYS_INLINE void unlock() { m_mutex.unlock(); } ALWAYS_INLINE void lock() { m_mutex.lock(); } private: Mutex& m_mutex; }; ALWAYS_INLINE void Mutex::lock() { pthread_mutex_lock(&m_mutex); } ALWAYS_INLINE void Mutex::unlock() { pthread_mutex_unlock(&m_mutex); } }