/** * Copyright (c) 2021 by Contributors * @file semaphore_wrapper.h * @brief A simple corss platform semaphore wrapper */ #ifndef DGL_RUNTIME_SEMAPHORE_WRAPPER_H_ #define DGL_RUNTIME_SEMAPHORE_WRAPPER_H_ #ifdef _WIN32 #include #else #include #endif namespace dgl { namespace runtime { /** * @brief A simple crossplatform Semaphore wrapper */ class Semaphore { public: /** * @brief Semaphore constructor */ Semaphore(); /** * @brief blocking wait, decrease semaphore by 1 */ void Wait(); /** * @brief timed wait, decrease semaphore by 1 or returns if times out * @param timeout The timeout value in milliseconds. If zero, wait * indefinitely. */ bool TimedWait(int timeout); /** * @brief increase semaphore by 1 */ void Post(); private: #ifdef _WIN32 HANDLE sem_; #else sem_t sem_; #endif enum { MILLISECONDS_PER_SECOND = 1000, NANOSECONDS_PER_MILLISECOND = 1000 * 1000, NANOSECONDS_PER_SECOND = 1000 * 1000 * 1000 }; }; } // namespace runtime } // namespace dgl #endif // DGL_RUNTIME_SEMAPHORE_WRAPPER_H_