diff options
Diffstat (limited to 'source/libs/asura-lib-utils/threading/mutex.h')
-rw-r--r-- | source/libs/asura-lib-utils/threading/mutex.h | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/source/libs/asura-lib-utils/threading/mutex.h b/source/libs/asura-lib-utils/threading/mutex.h new file mode 100644 index 0000000..7e7d877 --- /dev/null +++ b/source/libs/asura-lib-utils/threading/mutex.h @@ -0,0 +1,126 @@ +#ifndef __ASURA_MUTEX_H__ +#define __ASURA_MUTEX_H__ + +#include <asura-lib-utils/type.h> + +#include "../utils_config.h" + +#if ASURA_THREAD_WIN32 + #include <windows.h> +#endif + +namespace AsuraEngine +{ + namespace Threading + { + + class MutexImpl; + + class Mutex + { + public: + + Mutex(); + ~Mutex(); + + void Lock(); + void Unlock(); + + private: + + MutexImpl* mImpl; + + }; + + class _mutex_locker + { + public: + _mutex_locker(Mutex& mutex) + : m(mutex) + { + m.Lock(); + }; + ~_mutex_locker() + { + m.Unlock(); + } + private: + void* operator new(size_t); + Mutex& m; + }; + +// ڵջӴλÿʼջΪٽ +#define lock(mutex) _mutex_locker _asura_scoped_lock_0x0(mutex) +#define lock2(mutex) _mutex_locker _asura_scoped_lock_0x1(mutex) +#define lock3(mutex) _mutex_locker _asura_scoped_lock_0x2(mutex) +#define lock4(mutex) _mutex_locker _asura_scoped_lock_0x3(mutex) +#define lock5(mutex) _mutex_locker _asura_scoped_lock_0x4(mutex) + + ASURA_ABSTRACT class MutexImpl + { + public: + + MutexImpl() {}; + virtual ~MutexImpl() {}; + + virtual void Lock() = 0; + virtual void Unlock() = 0; + + }; + +#if ASURA_MUTEX_WIN32_CRITICLE_SECTION + + //https://blog.csdn.net/l799623787/article/details/18259949 + class MutexImplWin32_CS ASURA_FINAL : public MutexImpl + { + public: + + MutexImplWin32_CS(); + ~MutexImplWin32_CS(); + + void Lock() override; + void Unlock() override; + + private: + + //HANDLE mHandle; + CRITICAL_SECTION mMutex; + + }; + +#endif // ASURA_MUTEX_WIN32_CRITICLE_SECTION + +#if ASURA_MUTEX_WIN32_KERNAL_MUTEX + + class MutexImplWin32_KM ASURA_FINAL : public MutexImpl + { + public: + + MutexImplWin32_KM(); + ~MutexImplWin32_KM(); + + void Lock() override; + void Unlock() override; + + private: + + HANDLE mHandle; + + }; + +#endif // ASURA_MUTEX_WIN32_KERNAL_MUTEX + +#if ASURA_THREAD_STD + + class MutexImplSTD ASURA_FINAL : public MutexImpl + { + }; + +#endif // ASURA_THREAD_STD + + } +} + +namespace AEThreading = AsuraEngine::Threading; + +#endif
\ No newline at end of file |