// Copyright (C) 2017 Jérôme Leclercq // This file is part of the "Nazara Engine - Core module" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include #include #include #include namespace Nz { SemaphoreImpl::SemaphoreImpl(unsigned int count) { m_semaphore = CreateSemaphoreW(nullptr, count, std::numeric_limits::max(), nullptr); if (!m_semaphore) NazaraError("Failed to create semaphore: " + Error::GetLastSystemError()); } SemaphoreImpl::~SemaphoreImpl() { CloseHandle(m_semaphore); } unsigned int SemaphoreImpl::GetCount() const { LONG count; ReleaseSemaphore(m_semaphore, 0, &count); return count; } void SemaphoreImpl::Post() { #if NAZARA_CORE_SAFE if (!ReleaseSemaphore(m_semaphore, 1, nullptr)) NazaraError("Failed to release semaphore: " + Error::GetLastSystemError()); #else ReleaseSemaphore(m_semaphore, 1, nullptr); #endif } void SemaphoreImpl::Wait() { #if NAZARA_CORE_SAFE if (WaitForSingleObject(m_semaphore, INFINITE) == WAIT_FAILED) NazaraError("Failed to wait for semaphore: " + Error::GetLastSystemError()); #else WaitForSingleObject(m_semaphore, INFINITE); #endif } bool SemaphoreImpl::Wait(UInt32 timeout) { #if NAZARA_CORE_SAFE DWORD result = WaitForSingleObject(m_semaphore, timeout); if (result == WAIT_FAILED) { NazaraError("Failed to wait for semaphore: " + Error::GetLastSystemError()); return false; } else return result == WAIT_OBJECT_0; #else return WaitForSingleObject(m_semaphore, timeout) == WAIT_OBJECT_0; #endif } }