Add mechanism to reset/lock semaphores
authorRobin Gareus <robin@gareus.org>
Sat, 22 Apr 2017 21:00:53 +0000 (23:00 +0200)
committerRobin Gareus <robin@gareus.org>
Sat, 22 Apr 2017 21:06:22 +0000 (23:06 +0200)
libs/pbd/pbd/semutils.h
libs/pbd/semutils.cc

index 6c661ab499f63dea23b1d48e6073bf93dcd62312..e81e33e53352ec5cd9717eed5f9817912aff965a 100644 (file)
@@ -55,10 +55,12 @@ class LIBPBD_API Semaphore {
 
        int signal ();
        int wait ();
+       int reset ();
 
 #else
        int signal () { return sem_post (ptr_to_sem()); }
        int wait () { return sem_wait (ptr_to_sem()); }
+       int reset () { int rv = 0 ; while (sem_trywait (ptr_to_sem()) == 0) ++rv; return rv; }
 #endif
 };
 
index 7f31d30fafca5d5d8c32629bb1695b089c99468e..496eaf4d913641a8d91b9b704e5b5328c03c6a1e 100644 (file)
@@ -74,4 +74,16 @@ Semaphore::wait ()
        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