diff options
Diffstat (limited to 'source/libs/asura-lib-utils/threading/mutex.cpp')
-rw-r--r-- | source/libs/asura-lib-utils/threading/mutex.cpp | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/source/libs/asura-lib-utils/threading/mutex.cpp b/source/libs/asura-lib-utils/threading/mutex.cpp index e69de29..e0b6e1e 100644 --- a/source/libs/asura-lib-utils/threading/mutex.cpp +++ b/source/libs/asura-lib-utils/threading/mutex.cpp @@ -0,0 +1,81 @@ +#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_THREAD_WIN32 + try_create_mutex(MutexImplWin32); +#endif + ASSERT(mImpl); + } + + Mutex::~Mutex() + { + delete mImpl; + } + + void Mutex::Lock() + { + ASSERT(mImpl); + + mImpl->Lock(); + } + + void Mutex::Unlock() + { + ASSERT(mImpl); + + mImpl->Unlock(); + } + +#if ASURA_THREAD_WIN32 + MutexImplWin32::MutexImplWin32() + { + //mHandle = ::CreateMutex(NULL, FALSE, NULL); + //if (!mHandle) + // throw Exception("Cant use win32 mutex."); + ::InitializeCriticalSection(&mMutex); + } + + MutexImplWin32::~MutexImplWin32() + { + //::CloseHandle(mHandle); + //mHandle = NULL; + ::DeleteCriticalSection(&mMutex); + } + + void MutexImplWin32::Lock() + { + //::WaitForSingleObject(mHandle, INFINITE); + ::EnterCriticalSection(&mMutex); + } + + void MutexImplWin32::Unlock() + { + //::ReleaseMutex(mHandle); + ::LeaveCriticalSection(&mMutex); + } +#endif // ASURA_THREAD_WIN32 + + } +} |