+
+#ifdef WINDOWS_SEMAPHORE
+
+int
+Semaphore::signal ()
+{
+ // non-zero on success, opposite to posix
+ return !ReleaseSemaphore(_sem, 1, NULL);
+}
+
+int
+Semaphore::wait ()
+{
+ DWORD result = 0;
+ result = WaitForSingleObject(_sem, INFINITE);
+ return (result == WAIT_OBJECT_0);
+}
+
+int
+Semaphore::reset ()
+{
+ int rv = -1;
+ DWORD result;
+ do {
+ ++rv;
+ result = WaitForSingleObject(_sem, 0);
+ } while (result == WAIT_OBJECT_0);
+ return rv;
+}
+
+#endif