summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2013-07-11 12:46:05 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2013-07-11 12:46:05 -0400
commite70db68fac1adbb5c9823231aa800658c4d7cc12 (patch)
treeae89ffba1ad57bd5b32929276d10efa1ece06d46 /libs
parent8b63e005a15afb4cf769fd0c7fc91e48dde254a2 (diff)
Add implementation for ProcessSemaphore on windows
Diffstat (limited to 'libs')
-rw-r--r--libs/pbd/pbd/semutils.h16
-rw-r--r--libs/pbd/semutils.cc30
2 files changed, 43 insertions, 3 deletions
diff --git a/libs/pbd/pbd/semutils.h b/libs/pbd/pbd/semutils.h
index 6f5f0e9331..0e8bed0512 100644
--- a/libs/pbd/pbd/semutils.h
+++ b/libs/pbd/pbd/semutils.h
@@ -19,13 +19,20 @@
#ifndef __pbd_semutils_h__
#define __pbd_semutils_h__
+#ifdef WIN32
+#include <windows.h>
+#else
#include <semaphore.h>
+#endif
namespace PBD {
class ProcessSemaphore {
private:
-#ifdef __APPLE__
+#ifdef WIN32
+ HANDLE _sem;
+
+#elif __APPLE__
sem_t* _sem;
sem_t* ptr_to_sem() const { return _sem; }
#else
@@ -37,8 +44,15 @@ class ProcessSemaphore {
ProcessSemaphore (const char* name, int val);
~ProcessSemaphore ();
+#ifdef WIN32
+
+ int signal ();
+ int wait ();
+
+#else
int signal () { return sem_post (ptr_to_sem()); }
int wait () { return sem_wait (ptr_to_sem()); }
+#endif
};
}
diff --git a/libs/pbd/semutils.cc b/libs/pbd/semutils.cc
index 9ac5f60d35..e5df2e5c44 100644
--- a/libs/pbd/semutils.cc
+++ b/libs/pbd/semutils.cc
@@ -23,7 +23,12 @@ using namespace PBD;
ProcessSemaphore::ProcessSemaphore (const char* name, int val)
{
-#ifdef __APPLE__
+#ifdef WIN32
+ if ((_sem = CreateSemaphore(NULL, val, 32767, name)) == NULL) {
+ throw failed_constructor ();
+ }
+
+#elif __APPLE__
if ((_sem = sem_open (name, O_CREAT, 0600, val)) == (sem_t*) SEM_FAILED) {
throw failed_constructor ();
}
@@ -43,7 +48,28 @@ ProcessSemaphore::ProcessSemaphore (const char* name, int val)
ProcessSemaphore::~ProcessSemaphore ()
{
-#ifdef __APPLE__
+#ifdef WIN32
+ CloseHandle(_sem);
+#elif __APPLE__
sem_close (ptr_to_sem());
#endif
}
+
+#ifdef WIN32
+
+int
+ProcessSemaphore::signal ()
+{
+ // non-zero on success, opposite to posix
+ return !ReleaseSemaphore(_sem, 1, NULL);
+}
+
+int
+ProcessSemaphore::wait ()
+{
+ DWORD result = 0;
+ result = WaitForSingleObject(_sem, INFINITE);
+ return (result == WAIT_OBJECT_0);
+}
+
+#endif