#pragma once
#ifndef __semaphore_h__
#define __semaphore_h__
#include <mutex>
#include <condition_variable>
/*
 * C++ doesn't actually have semaphores.  It has mutexes and condition variables,
 * which we can use to make a semaphore.
 */
class semaphore {
public:
        semaphore(int init): m_value(init) { }
        /* Semaphore down operation. */
        void down();
        /* Semaphore up operation. */
        void up();
private:
        int m_value;                    // Value of semaphore.
        std::mutex m_mux;               // Controls access.
        std::condition_variable m_waitcond; // Controls waiting and restart
};
#endif