#pragma once #include #include #include "HAL/cpp/priority_mutex.h" class Semaphore { public: explicit Semaphore(uint32_t count = 0); Semaphore(Semaphore&&); Semaphore& operator=(Semaphore&&); void give(); void take(); // @return true if semaphore was locked successfully. false if not. bool tryTake(); static const int32_t kNoWait = 0; static const int32_t kWaitForever = -1; static const uint32_t kEmpty = 0; static const uint32_t kFull = 1; private: priority_mutex m_mutex; std::condition_variable_any m_condition; uint32_t m_count = 0; };