From 79506228ad696e7bb02db5bd395dd89a74041890 Mon Sep 17 00:00:00 2001 From: Jack Andersen Date: Sat, 29 Sep 2018 12:59:14 -1000 Subject: [PATCH] Add nxstl mutex to logvisor --- include/logvisor/logvisor.hpp | 4 ++ include/nxstl/mutex | 110 ++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 include/nxstl/mutex diff --git a/include/logvisor/logvisor.hpp b/include/logvisor/logvisor.hpp index ab826a3..fb20447 100644 --- a/include/logvisor/logvisor.hpp +++ b/include/logvisor/logvisor.hpp @@ -10,6 +10,10 @@ #include #include +#ifdef __SWITCH__ +#include "nxstl/mutex" +#endif + extern "C" void logvisorBp(); namespace logvisor diff --git a/include/nxstl/mutex b/include/nxstl/mutex new file mode 100644 index 0000000..68164a0 --- /dev/null +++ b/include/nxstl/mutex @@ -0,0 +1,110 @@ +#ifndef _NXSTL_MUTEX +#define _NXSTL_MUTEX 1 +#ifdef __SWITCH__ +#include + +namespace std _GLIBCXX_VISIBILITY(default) +{ + +// Common base class for std::mutex +class __mutex_base +{ +protected: + typedef Mutex __native_type; + + __native_type _M_mutex = {}; + + constexpr __mutex_base() noexcept = default; + + __mutex_base(const __mutex_base&) = delete; + __mutex_base& operator=(const __mutex_base&) = delete; +}; + +/// The standard mutex type. +class mutex : private __mutex_base +{ +public: + typedef __native_type* native_handle_type; + + constexpr mutex() noexcept = default; + ~mutex() = default; + + mutex(const mutex&) = delete; + mutex& operator=(const mutex&) = delete; + + void + lock() + { + mutexLock(&_M_mutex); + } + + bool + try_lock() noexcept + { + return mutexTryLock(&_M_mutex); + } + + void + unlock() + { + mutexUnlock(&_M_mutex); + } + + native_handle_type + native_handle() noexcept + { return &_M_mutex; } +}; + +// Common base class for std::recursive_mutex +class __recursive_mutex_base +{ +protected: + typedef RMutex __native_type; + + __recursive_mutex_base(const __recursive_mutex_base&) = delete; + __recursive_mutex_base& operator=(const __recursive_mutex_base&) = delete; + + __native_type _M_mutex = {}; + + __recursive_mutex_base() = default; +}; + +/// The standard recursive mutex type. +class recursive_mutex : private __recursive_mutex_base +{ +public: + typedef __native_type* native_handle_type; + + constexpr recursive_mutex() = default; + ~recursive_mutex() = default; + + recursive_mutex(const recursive_mutex&) = delete; + recursive_mutex& operator=(const recursive_mutex&) = delete; + + void + lock() + { + rmutexLock(&_M_mutex); + } + + bool + try_lock() noexcept + { + return rmutexTryLock(&_M_mutex); + } + + void + unlock() + { + rmutexUnlock(&_M_mutex); + } + + native_handle_type + native_handle() noexcept + { return &_M_mutex; } +}; + +} + +#endif +#endif