Mutex.h 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * Copyright (c) 2018-2021, Andreas Kling <kling@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Assertions.h>
  8. #include <AK/Types.h>
  9. #include <pthread.h>
  10. namespace Threading {
  11. class Mutex {
  12. public:
  13. Mutex()
  14. {
  15. #ifndef __serenity__
  16. pthread_mutexattr_t attr;
  17. pthread_mutexattr_init(&attr);
  18. pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
  19. pthread_mutex_init(&m_mutex, &attr);
  20. #endif
  21. }
  22. ~Mutex() { }
  23. void lock();
  24. void unlock();
  25. private:
  26. #ifdef __serenity__
  27. pthread_mutex_t m_mutex = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP;
  28. #else
  29. pthread_mutex_t m_mutex;
  30. #endif
  31. };
  32. class MutexLocker {
  33. public:
  34. ALWAYS_INLINE explicit MutexLocker(Mutex& mutex)
  35. : m_mutex(mutex)
  36. {
  37. lock();
  38. }
  39. ALWAYS_INLINE ~MutexLocker() { unlock(); }
  40. ALWAYS_INLINE void unlock() { m_mutex.unlock(); }
  41. ALWAYS_INLINE void lock() { m_mutex.lock(); }
  42. private:
  43. Mutex& m_mutex;
  44. };
  45. ALWAYS_INLINE void Mutex::lock()
  46. {
  47. pthread_mutex_lock(&m_mutex);
  48. }
  49. ALWAYS_INLINE void Mutex::unlock()
  50. {
  51. pthread_mutex_unlock(&m_mutex);
  52. }
  53. }