summaryrefslogtreecommitdiff
path: root/source/libs/asura-lib-utils/threading/mutex.cpp
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-03-27 22:18:14 +0800
committerchai <chaifix@163.com>2019-03-27 22:18:14 +0800
commit69f7d1bd745ed5680b9bc4e3cfdd882ff2a5ad26 (patch)
tree729e563da8fea6cf8c5455f3afdb3c6ce0aecde4 /source/libs/asura-lib-utils/threading/mutex.cpp
parent66c5fdc564dd892ed265132d6c1378dbe3cebcee (diff)
+threading
Diffstat (limited to 'source/libs/asura-lib-utils/threading/mutex.cpp')
-rw-r--r--source/libs/asura-lib-utils/threading/mutex.cpp81
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
+
+ }
+}