diff options
-rw-r--r-- | src/semaphore.cc | 21 |
1 files changed, 18 insertions, 3 deletions
diff --git a/src/semaphore.cc b/src/semaphore.cc index 8682a6e..49d3e94 100644 --- a/src/semaphore.cc +++ b/src/semaphore.cc @@ -44,6 +44,8 @@ struct semaphore_private_t { #if DG_PLATFORM == DG_PLATFORM_WINDOWS HANDLE semaphore; +#elif DG_PLATFORM == DG_PLATFORM_OSX + MPSemaphoreID semaphore; #else sem_t semaphore; #endif @@ -58,6 +60,10 @@ Semaphore::Semaphore(std::size_t initial_count) initial_count, std::numeric_limits<LONG>::max(), nullptr); // unnamed semaphore +#elif DG_PLATFORM == DG_PLATFORM_OSX + MPCreateSemaphore(std::numeric_limits<std::uint32_t>::max(), + initial_count, + &prv->semaphore); #else const int pshared = 0; memset(&prv->semaphore, 0, sizeof(sem_t)); @@ -69,6 +75,8 @@ Semaphore::~Semaphore() { #if DG_PLATFORM == DG_PLATFORM_WINDOWS CloseHandle(prv->semaphore); +#elif DG_PLATFORM == DG_PLATFORM_OSX + MPDeleteSemaphore(prv->semaphore); #else sem_destroy(&prv->semaphore); #endif @@ -80,6 +88,8 @@ void Semaphore::post() { #if DG_PLATFORM == DG_PLATFORM_WINDOWS ReleaseSemaphore(prv->semaphore, 1, nullptr); +#elif DG_PLATFORM == DG_PLATFORM_OSX + MPSignalSemaphore(prv->semaphore); #else sem_post(&prv->semaphore); #endif @@ -96,9 +106,12 @@ bool Semaphore::wait(const std::chrono::milliseconds& timeout) assert(ret == WAIT_OBJECT_0); #elif DG_PLATFORM == DG_PLATFORM_OSX - - // TODO: sem_timedwait not implemented on OSX - + auto ret = MPWaitOnSemaphore(prv->semaphore, + kDurationMillisecond * timeout.count()); + if(ret == kMPTimeoutErr) + { + return false; + } #else struct timespec ts; @@ -142,6 +155,8 @@ void Semaphore::wait() { #if DG_PLATFORM == DG_PLATFORM_WINDOWS WaitForSingleObject(prv->semaphore, INFINITE); +#elif DG_PLATFORM == DG_PLATFORM_OSX + MPWaitOnSemaphore(prv->semaphore, kDurationForever); #else sem_wait(&prv->semaphore); #endif |