summaryrefslogtreecommitdiff
path: root/src/semaphore.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/semaphore.cc')
-rw-r--r--src/semaphore.cc187
1 files changed, 0 insertions, 187 deletions
diff --git a/src/semaphore.cc b/src/semaphore.cc
deleted file mode 100644
index fdc33f1..0000000
--- a/src/semaphore.cc
+++ /dev/null
@@ -1,187 +0,0 @@
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/***************************************************************************
- * semaphore.cc
- *
- * Sat Oct 8 17:44:13 CEST 2005
- * Copyright 2005 Bent Bisballe Nyeng
- * deva@aasimon.org
- ****************************************************************************/
-
-/*
- * This file is part of DrumGizmo.
- *
- * DrumGizmo is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or
- * (at your option) any later version.
- *
- * DrumGizmo is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with DrumGizmo; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
- */
-#include "semaphore.h"
-
-#include <hugin.hpp>
-#include <limits>
-#include <assert.h>
-#include <string.h>
-#include <chrono>
-#include <thread>
-
-#include "platform.h"
-
-#if DG_PLATFORM != DG_PLATFORM_WINDOWS
-// Make sure we don't include /this/ file's header...
-#include <../include/semaphore.h>
-#include <errno.h>
-#include <stdio.h>
-#include <sys/time.h>
-#endif
-
-#if DG_PLATFORM == DG_PLATFORM_OSX
-//#include <Multiprocessing.h>
-#include <CoreServices/CoreServices.h>
-#endif
-
-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
-};
-
-Semaphore::Semaphore(std::size_t initial_count)
-{
- prv = new struct semaphore_private_t();
-
-#if DG_PLATFORM == DG_PLATFORM_WINDOWS
- prv->semaphore = CreateSemaphore(nullptr, // default security attributes
- 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));
- sem_init(&prv->semaphore, pshared, initial_count);
-#endif
-}
-
-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
-
- delete prv;
-}
-
-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
-}
-
-bool Semaphore::wait(const std::chrono::milliseconds& timeout)
-{
-#if DG_PLATFORM == DG_PLATFORM_WINDOWS
- DWORD ret = WaitForSingleObject(prv->semaphore, timeout.count());
- if(ret == WAIT_TIMEOUT)
- {
- return false;
- }
-
- assert(ret == WAIT_OBJECT_0);
-#elif DG_PLATFORM == DG_PLATFORM_OSX
- auto ret = MPWaitOnSemaphore(prv->semaphore,
- kDurationMillisecond * timeout.count());
- if(ret == kMPTimeoutErr)
- {
- return false;
- }
-#else
- struct timespec ts;
- clock_gettime(CLOCK_REALTIME, &ts);
-
- // Add timeout
- time_t seconds = (time_t)(timeout.count() / 1000);
- ts.tv_sec += seconds;
- ts.tv_nsec += (long)((timeout.count() % 1000) * 1000000);
-
- // Make sure we don't overflow the nanoseconds.
- constexpr long nsec = 1000000000LL;
- if(ts.tv_nsec >= nsec)
- {
- ts.tv_nsec -= nsec;
- ts.tv_sec += 1;
- }
-
-again:
- int ret = sem_timedwait(&prv->semaphore, &ts);
- if(ret < 0)
- {
- if(errno == EINTR)
- {
- // The timed wait were interrupted prematurely so we need to wait some
- // more. To prevent an infinite loop-like behaviour we make a short sleep.
- std::this_thread::sleep_for(std::chrono::milliseconds(1));
- goto again;
- }
-
- if(errno == ETIMEDOUT)
- {
- return false;
- }
-
- perror("sem_timedwait()");
- assert(false);
- }
-#endif
-
- return true;
-}
-
-void Semaphore::wait()
-{
-#if DG_PLATFORM == DG_PLATFORM_WINDOWS
- WaitForSingleObject(prv->semaphore, INFINITE);
-#elif DG_PLATFORM == DG_PLATFORM_OSX
- MPWaitOnSemaphore(prv->semaphore, kDurationForever);
-#else
-again:
- int ret = sem_wait(&prv->semaphore);
- if(ret < 0)
- {
- if(errno == EINTR)
- {
- // The wait were interrupted prematurely so we need to wait again
- // To prevent an infinite loop-like behaviour we make a short sleep.
- std::this_thread::sleep_for(std::chrono::milliseconds(1));
- goto again;
- }
-
- perror("sem_wait()");
- assert(false);
- }
-#endif
-}