summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/bx/src/mutex.cpp
diff options
context:
space:
mode:
author mooglyguy <therealmogminer@gmail.com>2018-12-05 19:45:08 +0100
committer mooglyguy <therealmogminer@gmail.com>2018-12-05 19:45:08 +0100
commit0bd02131b644b61088789f52f31b750c9aecaa6d (patch)
tree811c679a1bba8b24fc7967cdfe73640254d64156 /3rdparty/bx/src/mutex.cpp
parent9a81ec7eaf00d73a23db5c003dc45b55d4b76c4a (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.cpp74
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