diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2013-07-11 12:46:05 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2013-07-11 12:46:05 -0400 |
commit | e70db68fac1adbb5c9823231aa800658c4d7cc12 (patch) | |
tree | ae89ffba1ad57bd5b32929276d10efa1ece06d46 /libs | |
parent | 8b63e005a15afb4cf769fd0c7fc91e48dde254a2 (diff) |
Add implementation for ProcessSemaphore on windows
Diffstat (limited to 'libs')
-rw-r--r-- | libs/pbd/pbd/semutils.h | 16 | ||||
-rw-r--r-- | libs/pbd/semutils.cc | 30 |
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 |