summaryrefslogtreecommitdiff
path: root/thirdparty/etcpak/Semaphore.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/etcpak/Semaphore.hpp')
-rw-r--r--thirdparty/etcpak/Semaphore.hpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/thirdparty/etcpak/Semaphore.hpp b/thirdparty/etcpak/Semaphore.hpp
new file mode 100644
index 0000000000..9e42dbb9e0
--- /dev/null
+++ b/thirdparty/etcpak/Semaphore.hpp
@@ -0,0 +1,46 @@
+#ifndef __DARKRL__SEMAPHORE_HPP__
+#define __DARKRL__SEMAPHORE_HPP__
+
+#include <condition_variable>
+#include <mutex>
+
+class Semaphore
+{
+public:
+ Semaphore( int count ) : m_count( count ) {}
+
+ void lock()
+ {
+ std::unique_lock<std::mutex> lock( m_mutex );
+ m_cv.wait( lock, [this](){ return m_count != 0; } );
+ m_count--;
+ }
+
+ void unlock()
+ {
+ std::lock_guard<std::mutex> lock( m_mutex );
+ m_count++;
+ m_cv.notify_one();
+ }
+
+ bool try_lock()
+ {
+ std::lock_guard<std::mutex> lock( m_mutex );
+ if( m_count == 0 )
+ {
+ return false;
+ }
+ else
+ {
+ m_count--;
+ return true;
+ }
+ }
+
+private:
+ std::mutex m_mutex;
+ std::condition_variable m_cv;
+ unsigned int m_count;
+};
+
+#endif