summaryrefslogtreecommitdiff
path: root/source/libs/asura-lib-utils/threading/semaphore.h
diff options
context:
space:
mode:
Diffstat (limited to 'source/libs/asura-lib-utils/threading/semaphore.h')
-rw-r--r--source/libs/asura-lib-utils/threading/semaphore.h70
1 files changed, 70 insertions, 0 deletions
diff --git a/source/libs/asura-lib-utils/threading/semaphore.h b/source/libs/asura-lib-utils/threading/semaphore.h
new file mode 100644
index 0000000..80773d8
--- /dev/null
+++ b/source/libs/asura-lib-utils/threading/semaphore.h
@@ -0,0 +1,70 @@
+#ifndef __ASURA_SEMAPHORE_H__
+#define __ASURA_SEMAPHORE_H__
+
+#include "../utils_config.h"
+
+#if ASURA_THREAD_WIN32
+#include <windows.h>
+#endif
+
+namespace AsuraEngine
+{
+ namespace Threading
+ {
+
+ class SemaphoreImpl;
+
+ ///
+ /// ź
+ ///
+ class Semaphore
+ {
+ public:
+
+ Semaphore(unsigned int init_count = 1);
+ ~Semaphore();
+
+ void Signal();
+ void Wait(int timeout = 0);
+
+ private:
+ SemaphoreImpl* mImpl;
+ };
+
+ class SemaphoreImpl
+ {
+ public:
+ SemaphoreImpl(unsigned int init_value)
+ : mCount(init_value)
+ {
+ };
+ virtual ~SemaphoreImpl() {};
+ virtual void Signal() = 0;
+ virtual bool Wait(int timeout) = 0;
+ inline int Current() { return mCount; }
+ protected:
+ unsigned int mCount;
+ };
+
+#define wait(sem) sem.Wait();
+#define signal(sem) sem.Signal();
+
+#if ASURA_THREAD_WIN32
+
+ class SemaphoreWin32 : public SemaphoreImpl
+ {
+ public:
+ SemaphoreWin32(unsigned int init_value);
+ ~SemaphoreWin32();
+ void Signal() override;
+ bool Wait(int timeout) override;
+ private:
+ HANDLE mSem;
+ };
+
+#endif // ASURA_THREAD_WIN32
+
+ }
+}
+
+#endif \ No newline at end of file