X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=source%2Fcore%2Fwindows%2Fsemaphore.cpp;fp=source%2Fcore%2Fwindows%2Fsemaphore.cpp;h=aeb1709241d31993495ad8d97c6ee4f2aa197009;hb=609c9a508cfdc7b42c46c4f21d17639204165a00;hp=0000000000000000000000000000000000000000;hpb=b4806214e905752617691f851717033fd3f266c2;p=libs%2Fcore.git diff --git a/source/core/windows/semaphore.cpp b/source/core/windows/semaphore.cpp new file mode 100644 index 0000000..aeb1709 --- /dev/null +++ b/source/core/windows/semaphore.cpp @@ -0,0 +1,47 @@ +#include +#include +#include +#include "semaphore.h" + +namespace Msp { + +struct Semaphore::Private +{ + HANDLE handle; +}; + + +Semaphore::Semaphore(unsigned limit): + priv(new Private) +{ + priv->handle = CreateSemaphore(0, 0, limit, 0); +} + +Semaphore::~Semaphore() +{ + CloseHandle(priv->handle); + delete priv; +} + +void Semaphore::signal() +{ + if(!ReleaseSemaphore(priv->handle, 1, 0)) + throw system_error("ReleaseSemaphore"); +} + +void Semaphore::wait() +{ + DWORD ret = WaitForSingleObject(priv->handle, INFINITE); + if(ret==WAIT_FAILED) + throw system_error("WaitForSingleObject"); +} + +bool Semaphore::wait(const Time::TimeDelta &d) +{ + DWORD ret = WaitForSingleObject(priv->handle, (DWORD)(d/Time::usec)); + if(ret==WAIT_FAILED) + throw system_error("WaitForSingleObject"); + return ret==WAIT_OBJECT_0; +} + +} // namespace Msp