diff options
author | 2018-12-05 19:45:08 +0100 | |
---|---|---|
committer | 2018-12-05 19:45:08 +0100 | |
commit | 0bd02131b644b61088789f52f31b750c9aecaa6d (patch) | |
tree | 811c679a1bba8b24fc7967cdfe73640254d64156 /3rdparty/bx/src/mutex.cpp | |
parent | 9a81ec7eaf00d73a23db5c003dc45b55d4b76c4a (diff) |
3rdparty: Updated bgfx, bimg, and bx to latest upstream. [Ryan Holtz]
Diffstat (limited to '3rdparty/bx/src/mutex.cpp')
-rw-r--r-- | 3rdparty/bx/src/mutex.cpp | 74 |
1 files changed, 64 insertions, 10 deletions
diff --git a/3rdparty/bx/src/mutex.cpp b/3rdparty/bx/src/mutex.cpp index 74e3c14cf28..27c6b63b709 100644 --- a/3rdparty/bx/src/mutex.cpp +++ b/3rdparty/bx/src/mutex.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2010-2017 Branimir Karadzic. All rights reserved. + * Copyright 2010-2018 Branimir Karadzic. All rights reserved. * License: https://github.com/bkaradzic/bx#license-bsd-2-clause */ @@ -8,7 +8,10 @@ #if BX_CONFIG_SUPPORTS_THREADING -#if BX_PLATFORM_ANDROID \ +#if BX_CRT_NONE +# include <bx/cpu.h> +# include "crt0.h" +#elif BX_PLATFORM_ANDROID \ || BX_PLATFORM_LINUX \ || BX_PLATFORM_IOS \ || BX_PLATFORM_OSX \ @@ -24,7 +27,57 @@ namespace bx { -#if BX_PLATFORM_WINDOWS \ +#if BX_CRT_NONE + struct State + { + enum Enum + { + Unlocked, + Locked, + Contested, + }; + }; + + Mutex::Mutex() + { + BX_STATIC_ASSERT(sizeof(int32_t) <= sizeof(m_internal) ); + + uint32_t* futex = (uint32_t*)m_internal; + *futex = State::Unlocked; + } + + Mutex::~Mutex() + { + } + + void Mutex::lock() + { + uint32_t* futex = (uint32_t*)m_internal; + + if (State::Unlocked == bx::atomicCompareAndSwap<uint32_t>(futex, State::Unlocked, State::Locked) ) + { + return; + } + + while (State::Unlocked != bx::atomicCompareAndSwap<uint32_t>(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<uint32_t>(futex, State::Locked, State::Unlocked) ) + { + crt0::futexWake(futex, State::Locked); + } + } + +#else + +# if BX_PLATFORM_WINDOWS \ || BX_PLATFORM_XBOXONE \ || BX_PLATFORM_WINRT typedef CRITICAL_SECTION pthread_mutex_t; @@ -49,11 +102,11 @@ namespace bx inline int pthread_mutex_init(pthread_mutex_t* _mutex, pthread_mutexattr_t* /*_attr*/) { -#if BX_PLATFORM_WINRT +# if BX_PLATFORM_WINRT InitializeCriticalSectionEx(_mutex, 4000, 0); // docs recommend 4000 spincount as sane default -#else +# else InitializeCriticalSection(_mutex); -#endif // BX_PLATFORM_ +# endif // BX_PLATFORM_ return 0; } @@ -62,7 +115,7 @@ namespace bx DeleteCriticalSection(_mutex); return 0; } -#endif // BX_PLATFORM_ +# endif // BX_PLATFORM_ Mutex::Mutex() { @@ -70,13 +123,13 @@ namespace bx pthread_mutexattr_t attr; -#if BX_PLATFORM_WINDOWS \ +# if BX_PLATFORM_WINDOWS \ || BX_PLATFORM_XBOXONE \ || BX_PLATFORM_WINRT -#else +# else pthread_mutexattr_init(&attr); pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); -#endif // BX_PLATFORM_ +# endif // BX_PLATFORM_ pthread_mutex_t* handle = (pthread_mutex_t*)m_internal; pthread_mutex_init(handle, &attr); @@ -99,6 +152,7 @@ namespace bx pthread_mutex_t* handle = (pthread_mutex_t*)m_internal; pthread_mutex_unlock(handle); } +#endif // BX_CRT_NONE } // namespace bx |