diff options
Diffstat (limited to 'thirdparty/etcpak/Semaphore.hpp')
-rw-r--r-- | thirdparty/etcpak/Semaphore.hpp | 46 |
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 |