diff --git a/include/bx/mutex.h b/include/bx/mutex.h index 8de4b83..c5d753c 100644 --- a/include/bx/mutex.h +++ b/include/bx/mutex.h @@ -7,66 +7,14 @@ #define BX_MUTEX_H_HEADER_GUARD #include "bx.h" -#include "cpu.h" #include "os.h" #include "sem.h" #if BX_CONFIG_SUPPORTS_THREADING -#if 0 \ - || BX_PLATFORM_ANDROID \ - || BX_PLATFORM_LINUX \ - || BX_PLATFORM_NACL \ - || BX_PLATFORM_IOS \ - || BX_PLATFORM_OSX -# include -#elif 0 \ - || BX_PLATFORM_WINDOWS \ - || BX_PLATFORM_WINRT \ - || BX_PLATFORM_XBOX360 -# include -#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_ - + /// class Mutex { BX_CLASS(Mutex @@ -75,36 +23,27 @@ namespace bx ); 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(); - ~Mutex() - { - pthread_mutex_destroy(&m_handle); - } + /// + ~Mutex(); - void lock() - { - pthread_mutex_lock(&m_handle); - } + /// + void lock(); - void unlock() - { - pthread_mutex_unlock(&m_handle); - } + /// + void unlock(); private: +#if BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE || BX_PLATFORM_WINRT + CRITICAL_SECTION m_handle; +#else pthread_mutex_t m_handle; +#endif // BX_PLATFORM_WINDOWS || BX_PLATFORM_XBOX360 || BX_PLATFORM_XBOXONE || BX_PLATFORM_WINRT }; + /// class MutexScope { BX_CLASS(MutexScope @@ -114,16 +53,11 @@ namespace bx ); public: - MutexScope(Mutex& _mutex) - : m_mutex(_mutex) - { - m_mutex.lock(); - } + /// + MutexScope(Mutex& _mutex); - ~MutexScope() - { - m_mutex.unlock(); - } + /// + ~MutexScope(); private: Mutex& m_mutex; @@ -131,6 +65,7 @@ namespace bx typedef Mutex LwMutex; + /// class LwMutexScope { BX_CLASS(LwMutexScope @@ -140,16 +75,11 @@ namespace bx ); public: - LwMutexScope(LwMutex& _mutex) - : m_mutex(_mutex) - { - m_mutex.lock(); - } + /// + LwMutexScope(LwMutex& _mutex); - ~LwMutexScope() - { - m_mutex.unlock(); - } + /// + ~LwMutexScope(); private: LwMutex& m_mutex; @@ -157,6 +87,8 @@ namespace bx } // namespace bx +#include "mutex.inl" + #endif // BX_CONFIG_SUPPORTS_THREADING #endif // BX_MUTEX_H_HEADER_GUARD diff --git a/include/bx/mutex.inl b/include/bx/mutex.inl new file mode 100644 index 0000000..0d41402 --- /dev/null +++ b/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 diff --git a/src/mutex.cpp b/src/mutex.cpp new file mode 100644 index 0000000..00e5176 --- /dev/null +++ b/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 + +#if BX_CONFIG_SUPPORTS_THREADING + +#if 0 \ + || BX_PLATFORM_ANDROID \ + || BX_PLATFORM_LINUX \ + || BX_PLATFORM_NACL \ + || BX_PLATFORM_IOS \ + || BX_PLATFORM_OSX +# include +#elif 0 \ + || BX_PLATFORM_WINDOWS \ + || BX_PLATFORM_WINRT \ + || BX_PLATFORM_XBOX360 +# include +#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