|
@@ -7,66 +7,14 @@
|
|
|
#define BX_MUTEX_H_HEADER_GUARD
|
|
#define BX_MUTEX_H_HEADER_GUARD
|
|
|
|
|
|
|
|
#include "bx.h"
|
|
#include "bx.h"
|
|
|
-#include "cpu.h"
|
|
|
|
|
#include "os.h"
|
|
#include "os.h"
|
|
|
#include "sem.h"
|
|
#include "sem.h"
|
|
|
|
|
|
|
|
#if BX_CONFIG_SUPPORTS_THREADING
|
|
#if BX_CONFIG_SUPPORTS_THREADING
|
|
|
|
|
|
|
|
-#if 0 \
|
|
|
|
|
- || BX_PLATFORM_ANDROID \
|
|
|
|
|
- || BX_PLATFORM_LINUX \
|
|
|
|
|
- || BX_PLATFORM_NACL \
|
|
|
|
|
- || BX_PLATFORM_IOS \
|
|
|
|
|
- || BX_PLATFORM_OSX
|
|
|
|
|
-# include <pthread.h>
|
|
|
|
|
-#elif 0 \
|
|
|
|
|
- || BX_PLATFORM_WINDOWS \
|
|
|
|
|
- || BX_PLATFORM_WINRT \
|
|
|
|
|
- || BX_PLATFORM_XBOX360
|
|
|
|
|
-# include <errno.h>
|
|
|
|
|
-#endif // BX_PLATFORM_
|
|
|
|
|
-
|
|
|
|
|
namespace bx
|
|
namespace bx
|
|
|
{
|
|
{
|
|
|
-#if BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE || BX_PLATFORM_WINRT
|
|
|
|
|
- typedef CRITICAL_SECTION pthread_mutex_t;
|
|
|
|
|
- typedef unsigned pthread_mutexattr_t;
|
|
|
|
|
-
|
|
|
|
|
- inline int pthread_mutex_lock(pthread_mutex_t* _mutex)
|
|
|
|
|
- {
|
|
|
|
|
- EnterCriticalSection(_mutex);
|
|
|
|
|
- return 0;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- inline int pthread_mutex_unlock(pthread_mutex_t* _mutex)
|
|
|
|
|
- {
|
|
|
|
|
- LeaveCriticalSection(_mutex);
|
|
|
|
|
- return 0;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- inline int pthread_mutex_trylock(pthread_mutex_t* _mutex)
|
|
|
|
|
- {
|
|
|
|
|
- return TryEnterCriticalSection(_mutex) ? 0 : EBUSY;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- inline int pthread_mutex_init(pthread_mutex_t* _mutex, pthread_mutexattr_t* /*_attr*/)
|
|
|
|
|
- {
|
|
|
|
|
-#if BX_PLATFORM_WINRT
|
|
|
|
|
- InitializeCriticalSectionEx(_mutex, 4000, 0); // docs recommend 4000 spincount as sane default
|
|
|
|
|
-#else
|
|
|
|
|
- InitializeCriticalSection(_mutex);
|
|
|
|
|
-#endif
|
|
|
|
|
- return 0;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- inline int pthread_mutex_destroy(pthread_mutex_t* _mutex)
|
|
|
|
|
- {
|
|
|
|
|
- DeleteCriticalSection(_mutex);
|
|
|
|
|
- return 0;
|
|
|
|
|
- }
|
|
|
|
|
-#endif // BX_PLATFORM_
|
|
|
|
|
-
|
|
|
|
|
|
|
+ ///
|
|
|
class Mutex
|
|
class Mutex
|
|
|
{
|
|
{
|
|
|
BX_CLASS(Mutex
|
|
BX_CLASS(Mutex
|
|
@@ -75,36 +23,27 @@ namespace bx
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
public:
|
|
public:
|
|
|
- Mutex()
|
|
|
|
|
- {
|
|
|
|
|
- pthread_mutexattr_t attr;
|
|
|
|
|
-#if BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE || BX_PLATFORM_WINRT
|
|
|
|
|
-#else
|
|
|
|
|
- pthread_mutexattr_init(&attr);
|
|
|
|
|
- pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
|
|
|
|
|
-#endif // BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOX360 || BX_PLATFORM_WINRT
|
|
|
|
|
- pthread_mutex_init(&m_handle, &attr);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- ~Mutex()
|
|
|
|
|
- {
|
|
|
|
|
- pthread_mutex_destroy(&m_handle);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- void lock()
|
|
|
|
|
- {
|
|
|
|
|
- pthread_mutex_lock(&m_handle);
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- void unlock()
|
|
|
|
|
- {
|
|
|
|
|
- pthread_mutex_unlock(&m_handle);
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ ///
|
|
|
|
|
+ Mutex();
|
|
|
|
|
+
|
|
|
|
|
+ ///
|
|
|
|
|
+ ~Mutex();
|
|
|
|
|
+
|
|
|
|
|
+ ///
|
|
|
|
|
+ void lock();
|
|
|
|
|
+
|
|
|
|
|
+ ///
|
|
|
|
|
+ void unlock();
|
|
|
|
|
|
|
|
private:
|
|
private:
|
|
|
|
|
+#if BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE || BX_PLATFORM_WINRT
|
|
|
|
|
+ CRITICAL_SECTION m_handle;
|
|
|
|
|
+#else
|
|
|
pthread_mutex_t m_handle;
|
|
pthread_mutex_t m_handle;
|
|
|
|
|
+#endif // BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE || BX_PLATFORM_WINRT
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+ ///
|
|
|
class MutexScope
|
|
class MutexScope
|
|
|
{
|
|
{
|
|
|
BX_CLASS(MutexScope
|
|
BX_CLASS(MutexScope
|
|
@@ -114,16 +53,11 @@ namespace bx
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
public:
|
|
public:
|
|
|
- MutexScope(Mutex& _mutex)
|
|
|
|
|
- : m_mutex(_mutex)
|
|
|
|
|
- {
|
|
|
|
|
- m_mutex.lock();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ ///
|
|
|
|
|
+ MutexScope(Mutex& _mutex);
|
|
|
|
|
|
|
|
- ~MutexScope()
|
|
|
|
|
- {
|
|
|
|
|
- m_mutex.unlock();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ ///
|
|
|
|
|
+ ~MutexScope();
|
|
|
|
|
|
|
|
private:
|
|
private:
|
|
|
Mutex& m_mutex;
|
|
Mutex& m_mutex;
|
|
@@ -131,6 +65,7 @@ namespace bx
|
|
|
|
|
|
|
|
typedef Mutex LwMutex;
|
|
typedef Mutex LwMutex;
|
|
|
|
|
|
|
|
|
|
+ ///
|
|
|
class LwMutexScope
|
|
class LwMutexScope
|
|
|
{
|
|
{
|
|
|
BX_CLASS(LwMutexScope
|
|
BX_CLASS(LwMutexScope
|
|
@@ -140,16 +75,11 @@ namespace bx
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
public:
|
|
public:
|
|
|
- LwMutexScope(LwMutex& _mutex)
|
|
|
|
|
- : m_mutex(_mutex)
|
|
|
|
|
- {
|
|
|
|
|
- m_mutex.lock();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ ///
|
|
|
|
|
+ LwMutexScope(LwMutex& _mutex);
|
|
|
|
|
|
|
|
- ~LwMutexScope()
|
|
|
|
|
- {
|
|
|
|
|
- m_mutex.unlock();
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ ///
|
|
|
|
|
+ ~LwMutexScope();
|
|
|
|
|
|
|
|
private:
|
|
private:
|
|
|
LwMutex& m_mutex;
|
|
LwMutex& m_mutex;
|
|
@@ -157,6 +87,8 @@ namespace bx
|
|
|
|
|
|
|
|
} // namespace bx
|
|
} // namespace bx
|
|
|
|
|
|
|
|
|
|
+#include "mutex.inl"
|
|
|
|
|
+
|
|
|
#endif // BX_CONFIG_SUPPORTS_THREADING
|
|
#endif // BX_CONFIG_SUPPORTS_THREADING
|
|
|
|
|
|
|
|
#endif // BX_MUTEX_H_HEADER_GUARD
|
|
#endif // BX_MUTEX_H_HEADER_GUARD
|