]> git.tdb.fi Git - libs/core.git/blobdiff - source/core/windows/semaphore.cpp
Move most platform-specific code into overlay directories
[libs/core.git] / source / core / windows / semaphore.cpp
diff --git a/source/core/windows/semaphore.cpp b/source/core/windows/semaphore.cpp
new file mode 100644 (file)
index 0000000..aeb1709
--- /dev/null
@@ -0,0 +1,47 @@
+#include <windows.h>
+#include <msp/core/systemerror.h>
+#include <msp/time/units.h>
+#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