summaryrefslogtreecommitdiff
path: root/source/modules/asura-utils/Threads/Mutex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/modules/asura-utils/Threads/Mutex.cpp')
-rw-r--r--source/modules/asura-utils/Threads/Mutex.cpp105
1 files changed, 105 insertions, 0 deletions
diff --git a/source/modules/asura-utils/Threads/Mutex.cpp b/source/modules/asura-utils/Threads/Mutex.cpp
new file mode 100644
index 0000000..501a0ed
--- /dev/null
+++ b/source/modules/asura-utils/Threads/Mutex.cpp
@@ -0,0 +1,105 @@
+#include <asura-utils/Exceptions/Exception.h>
+
+#include "Mutex.h"
+
+namespace_begin(AsuraEngine)
+namespace_begin(Threads)
+
+#define try_create_mutex(impl)\
+if (!m_Impl) \
+{ \
+try \
+{ \
+ m_Impl = new impl(); \
+} \
+catch (Exception& e) \
+{ \
+ m_Impl = nullptr; \
+} \
+}
+
+Mutex::Mutex()
+ : m_Impl(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(m_Impl);
+}
+
+Mutex::~Mutex()
+{
+ if(m_Impl)
+ delete m_Impl;
+}
+
+void Mutex::Lock()
+{
+ ASSERT(m_Impl);
+
+ m_Impl->Lock();
+}
+
+void Mutex::Unlock()
+{
+ ASSERT(m_Impl);
+
+ m_Impl->Unlock();
+}
+
+#if ASURA_MUTEX_WIN32_CRITICLE_SECTION
+
+MutexImplWin32_CS::MutexImplWin32_CS()
+{
+ ::InitializeCriticalSection(&m_Mutex);
+}
+
+MutexImplWin32_CS::~MutexImplWin32_CS()
+{
+ ::DeleteCriticalSection(&m_Mutex);
+}
+
+void MutexImplWin32_CS::Lock()
+{
+ ::EnterCriticalSection(&m_Mutex);
+}
+
+void MutexImplWin32_CS::Unlock()
+{
+ ::LeaveCriticalSection(&m_Mutex);
+}
+
+#endif // ASURA_MUTEX_WIN32_CRITICLE_SECTION
+
+#if ASURA_MUTEX_WIN32_KERNAL_MUTEX
+
+MutexImplWin32_KM::MutexImplWin32_KM()
+{
+ m_Handle = ::CreateMutex(NULL, FALSE, NULL);
+ if (!m_Handle)
+ throw Exception("Cant use win32 mutex.");
+}
+
+MutexImplWin32_KM::~MutexImplWin32_KM()
+{
+ ::CloseHandle(m_Handle);
+ m_Handle = NULL;
+}
+
+void MutexImplWin32_KM::Lock()
+{
+ ::WaitForSingleObject(m_Handle, ASURA_MUTEX_MAXWAIT);
+}
+
+void MutexImplWin32_KM::Unlock()
+{
+ ::ReleaseMutex(m_Handle);
+}
+
+#endif // ASURA_MUTEX_WIN32_KERNAL_MUTEX
+
+namespace_end
+namespace_end \ No newline at end of file