Branimir Karadžić 9 years ago
parent
commit
2350959205
3 changed files with 154 additions and 96 deletions
  1. 28 96
      include/bx/mutex.h
  2. 34 0
      include/bx/mutex.inl
  3. 92 0
      src/mutex.cpp

+ 28 - 96
include/bx/mutex.h

@@ -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

+ 34 - 0
include/bx/mutex.inl

@@ -0,0 +1,34 @@
+/*
+ * Copyright 2010-2017 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
+ */
+
+#ifndef BX_MUTEX_H_HEADER_GUARD
+#	error "Must be included from bx/mutex.h!"
+#endif // BX_MUTEX_H_HEADER_GUARD
+
+namespace bx
+{
+	inline MutexScope::MutexScope(Mutex& _mutex)
+		: m_mutex(_mutex)
+	{
+		m_mutex.lock();
+	}
+
+	inline MutexScope::~MutexScope()
+	{
+		m_mutex.unlock();
+	}
+
+	inline LwMutexScope::LwMutexScope(LwMutex& _mutex)
+		: m_mutex(_mutex)
+	{
+		m_mutex.lock();
+	}
+
+	inline LwMutexScope::~LwMutexScope()
+	{
+		m_mutex.unlock();
+	}
+
+} // namespace bx

+ 92 - 0
src/mutex.cpp

@@ -0,0 +1,92 @@
+/*
+ * Copyright 2010-2017 Branimir Karadzic. All rights reserved.
+ * License: https://github.com/bkaradzic/bx#license-bsd-2-clause
+ */
+
+#include <bx/mutex.h>
+
+#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
+{
+#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_
+
+	Mutex::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::~Mutex()
+	{
+		pthread_mutex_destroy(&m_handle);
+	}
+
+	void Mutex::lock()
+	{
+		pthread_mutex_lock(&m_handle);
+	}
+
+	void Mutex::unlock()
+	{
+		pthread_mutex_unlock(&m_handle);
+	}
+
+} // namespace bx
+
+#endif // BX_MUTEX_H_HEADER_GUARD