This commit is contained in:
Branimir Karadžić
2017-01-20 16:09:33 -08:00
parent 053f9303ec
commit 2350959205
3 changed files with 151 additions and 93 deletions

View File

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

34
include/bx/mutex.inl Normal file
View File

@@ -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
src/mutex.cpp Normal file
View File

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