diff --git a/src/Nazara/Core/Posix/SemaphoreImpl.cpp b/src/Nazara/Core/Posix/SemaphoreImpl.cpp new file mode 100644 index 000000000..a88a68ca7 --- /dev/null +++ b/src/Nazara/Core/Posix/SemaphoreImpl.cpp @@ -0,0 +1,68 @@ +// Copyright (C) 2012 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 + +NzSemaphoreImpl::NzSemaphoreImpl(unsigned int count) +{ + m_semaphore = sem_init(&m_semaphore, 0, count); + if (!m_semaphore) + NazaraError("Failed to create semaphore: " + NzGetLastSystemError()); +} + +NzSemaphoreImpl::~NzSemaphoreImpl() +{ + sem_destroy(&m_semaphore); +} + +unsigned int NzSemaphoreImpl::GetCount() const +{ + int count; + sem_getvalue(&m_semaphore, &count); + return static_cast(count); +} + +void NzSemaphoreImpl::Post() +{ + #if NAZARA_CORE_SAFE + if (sem_post(&m_semaphore)==-1) + NazaraError("Failed to release semaphore: " + NzGetLastSystemError()); + #else + sem_post(&m_semaphore); + #endif +} + +void NzSemaphoreImpl::Wait() +{ + #if NAZARA_CORE_SAFE + if (sem_wait(&m_semaphore) == -1 ) + NazaraError("Failed to wait for semaphore: " + NzGetLastSystemError()); + #else + sem_wait(&m_semaphore); + #endif +} + +bool NzSemaphoreImpl::Wait(nzUInt32 timeout) +{ + timespec ti; + ti.tv_nsec = (tv.tv_usec + (timeout % 1000)) * 1000000; + ti.tv_sec = tv.tv_sec + (timeout / 1000) + (ti.tv_nsec / 1000000000); + ti.tv_nsec %= 1000000000; + + #if NAZARA_CORE_SAFE + if (sem_timedwait(m_semaphore, timeout) == -1) + { + NazaraError("Failed to wait for semaphore: " + NzGetLastSystemError()); + return false; + } + + return true; + #else + return sem_timedwait(&m_semaphore, ti) != -1; + #endif +} diff --git a/src/Nazara/Core/Posix/SemaphoreImpl.hpp b/src/Nazara/Core/Posix/SemaphoreImpl.hpp new file mode 100644 index 000000000..beae9028a --- /dev/null +++ b/src/Nazara/Core/Posix/SemaphoreImpl.hpp @@ -0,0 +1,28 @@ +// Copyright (C) 2012 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 + +#pragma once + +#ifndef NAZARA_SEMAPHOREIMPL_HPP +#define NAZARA_SEMAPHOREIMPL_HPP + +#include +#include + +class NzSemaphoreImpl +{ + public: + NzSemaphoreImpl(unsigned int count); + ~NzSemaphoreImpl(); + + unsigned int GetCount() const; + void Post(); + void Wait(); + bool Wait(nzUInt32 timeout); + + private: + sem_t m_semaphore; +}; + +#endif // NAZARA_SEMAPHOREIMPL_HPP