diff options
Diffstat (limited to 'source/libs/asura-lib-utils/threading/mutex.cpp')
-rw-r--r-- | source/libs/asura-lib-utils/threading/mutex.cpp | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/source/libs/asura-lib-utils/threading/mutex.cpp b/source/libs/asura-lib-utils/threading/mutex.cpp new file mode 100644 index 0000000..663ac28 --- /dev/null +++ b/source/libs/asura-lib-utils/threading/mutex.cpp @@ -0,0 +1,106 @@ +#include <asura-lib-utils/exceptions/exception.h> + +#include "mutex.h" + +namespace AsuraEngine +{ + namespace Threading + { + +#define try_create_mutex(impl)\ + if (!mImpl) \ + { \ + try \ + { \ + mImpl = new impl(); \ + } \ + catch (Exception& e) \ + { \ + mImpl = nullptr; \ + } \ + } + + Mutex::Mutex() + : mImpl(nullptr) + { +#if ASURA_MUTEX_WIN32_CRITICLE_SECTION + try_create_mutex(MutexImplWin32_CS); +#endif +#if ASURA_MUTEX_WIN32_KERNAL_MUTEX + try_create_mutex(MutexImplWin32_KM); +#endif + ASSERT(mImpl); + } + + Mutex::~Mutex() + { + delete mImpl; + } + + void Mutex::Lock() + { + ASSERT(mImpl); + + mImpl->Lock(); + } + + void Mutex::Unlock() + { + ASSERT(mImpl); + + mImpl->Unlock(); + } + +#if ASURA_MUTEX_WIN32_CRITICLE_SECTION + + MutexImplWin32_CS::MutexImplWin32_CS() + { + ::InitializeCriticalSection(&mMutex); + } + + MutexImplWin32_CS::~MutexImplWin32_CS() + { + ::DeleteCriticalSection(&mMutex); + } + + void MutexImplWin32_CS::Lock() + { + ::EnterCriticalSection(&mMutex); + } + + void MutexImplWin32_CS::Unlock() + { + ::LeaveCriticalSection(&mMutex); + } + +#endif // ASURA_MUTEX_WIN32_CRITICLE_SECTION + +#if ASURA_MUTEX_WIN32_KERNAL_MUTEX + + MutexImplWin32_KM::MutexImplWin32_KM() + { + mHandle = ::CreateMutex(NULL, FALSE, NULL); + if (!mHandle) + throw Exception("Cant use win32 mutex."); + } + + MutexImplWin32_KM::~MutexImplWin32_KM() + { + ::CloseHandle(mHandle); + mHandle = NULL; + } + + void MutexImplWin32_KM::Lock() + { + ::WaitForSingleObject(mHandle, INFINITE); + } + + void MutexImplWin32_KM::Unlock() + { + ::ReleaseMutex(mHandle); + } + +#endif // ASURA_MUTEX_WIN32_KERNAL_MUTEX + + } +} |