From 21191b04f805db9061cfd47ebbf5437eefc8e173 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Branimir=20Karad=C5=BEi=C4=87?= Date: Wed, 14 Mar 2018 22:30:37 -0700 Subject: [PATCH] crtnone: Added mutex. --- src/mutex.cpp | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/mutex.cpp b/src/mutex.cpp index 4eceb64..27c6b63 100644 --- a/src/mutex.cpp +++ b/src/mutex.cpp @@ -9,6 +9,8 @@ #if BX_CONFIG_SUPPORTS_THREADING #if BX_CRT_NONE +# include +# include "crt0.h" #elif BX_PLATFORM_ANDROID \ || BX_PLATFORM_LINUX \ || BX_PLATFORM_IOS \ @@ -26,9 +28,22 @@ namespace bx { #if BX_CRT_NONE + struct State + { + enum Enum + { + Unlocked, + Locked, + Contested, + }; + }; + Mutex::Mutex() { - BX_STATIC_ASSERT(sizeof(pthread_mutex_t) <= sizeof(m_internal) ); + BX_STATIC_ASSERT(sizeof(int32_t) <= sizeof(m_internal) ); + + uint32_t* futex = (uint32_t*)m_internal; + *futex = State::Unlocked; } Mutex::~Mutex() @@ -37,10 +52,27 @@ namespace bx void Mutex::lock() { + uint32_t* futex = (uint32_t*)m_internal; + + if (State::Unlocked == bx::atomicCompareAndSwap(futex, State::Unlocked, State::Locked) ) + { + return; + } + + while (State::Unlocked != bx::atomicCompareAndSwap(futex, State::Locked, State::Contested) ) + { + crt0::futexWait(futex, State::Contested); + } } void Mutex::unlock() { + uint32_t* futex = (uint32_t*)m_internal; + + if (State::Contested == bx::atomicCompareAndSwap(futex, State::Locked, State::Unlocked) ) + { + crt0::futexWake(futex, State::Locked); + } } #else