summaryrefslogtreecommitdiff
path: root/src/thread
diff options
context:
space:
mode:
authorMax Kellermann <max@musicpd.org>2019-04-25 18:37:08 +0200
committerMax Kellermann <max@musicpd.org>2019-05-07 19:57:53 +0200
commit230ca2e968e2e4f98e944026413cb7720c7d988b (patch)
tree4e2e0444dca486a831b09eac75aeb0827b6d3b35 /src/thread
parent9095167039592088c10c251b99c4d3ade6a59a8e (diff)
thread/{Mutex,Cond}: use std::mutex and std::condition_variable
On Windows, we keep using our own implementations, because GCC implements std::mutex and std::condition_variable with pthread emulation, which is not a good choice.
Diffstat (limited to 'src/thread')
-rw-r--r--src/thread/Cond.hxx4
-rw-r--r--src/thread/Mutex.hxx3
-rw-r--r--src/thread/PosixCond.hxx123
-rw-r--r--src/thread/PosixMutex.hxx76
4 files changed, 3 insertions, 203 deletions
diff --git a/src/thread/Cond.hxx b/src/thread/Cond.hxx
index 7123635df..01da04c60 100644
--- a/src/thread/Cond.hxx
+++ b/src/thread/Cond.hxx
@@ -37,8 +37,8 @@ class Cond : public WindowsCond {};
#else
-#include "PosixCond.hxx"
-class Cond : public PosixCond {};
+#include <condition_variable>
+using Cond = std::condition_variable;
#endif
diff --git a/src/thread/Mutex.hxx b/src/thread/Mutex.hxx
index a28bb13a7..3d79e2307 100644
--- a/src/thread/Mutex.hxx
+++ b/src/thread/Mutex.hxx
@@ -39,8 +39,7 @@ using Mutex = CriticalSection;
#else
-#include "PosixMutex.hxx"
-using Mutex = PosixMutex;
+using Mutex = std::mutex;
#endif
diff --git a/src/thread/PosixCond.hxx b/src/thread/PosixCond.hxx
deleted file mode 100644
index 8ab2a3f03..000000000
--- a/src/thread/PosixCond.hxx
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2009-2019 Max Kellermann <max.kellermann@gmail.com>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THREAD_POSIX_COND_HXX
-#define THREAD_POSIX_COND_HXX
-
-#include "PosixMutex.hxx"
-
-#include <chrono>
-#include <mutex>
-
-#include <sys/time.h>
-
-/**
- * Low-level wrapper for a pthread_cond_t.
- */
-class PosixCond {
- pthread_cond_t cond;
-
-public:
-#if defined(__GLIBC__) && !defined(__gnu_hurd__)
- /* optimized constexpr constructor for pthread implementations
- that support it */
- constexpr PosixCond() noexcept:cond(PTHREAD_COND_INITIALIZER) {}
-#else
- /* slow fallback for pthread implementations that are not
- compatible with "constexpr" */
- PosixCond() noexcept {
- pthread_cond_init(&cond, nullptr);
- }
-
- ~PosixCond() noexcept {
- pthread_cond_destroy(&cond);
- }
-#endif
-
- PosixCond(const PosixCond &other) = delete;
- PosixCond &operator=(const PosixCond &other) = delete;
-
- void notify_one() noexcept {
- pthread_cond_signal(&cond);
- }
-
- void notify_all() noexcept {
- pthread_cond_broadcast(&cond);
- }
-
- void wait(std::unique_lock<PosixMutex> &lock) noexcept {
- pthread_cond_wait(&cond, &lock.mutex()->mutex);
- }
-
-private:
- bool wait_for(std::unique_lock<PosixMutex> &lock,
- uint_least32_t timeout_us) noexcept {
- struct timeval now;
- gettimeofday(&now, nullptr);
-
- struct timespec ts;
- ts.tv_sec = now.tv_sec + timeout_us / 1000000;
- ts.tv_nsec = (now.tv_usec + (timeout_us % 1000000)) * 1000;
- // Keep tv_nsec < 1E9 to prevent return of EINVAL
- if (ts.tv_nsec >= 1000000000) {
- ts.tv_nsec -= 1000000000;
- ts.tv_sec++;
- }
-
- return pthread_cond_timedwait(&cond, &lock.mutex()->mutex, &ts) == 0;
- }
-
-public:
- template<typename M>
- bool wait_for(std::unique_lock<M> &lock,
- std::chrono::steady_clock::duration timeout) noexcept {
- auto timeout_us = std::chrono::duration_cast<std::chrono::microseconds>(timeout).count();
- if (timeout_us < 0)
- timeout_us = 0;
- else if (timeout_us > std::numeric_limits<uint_least32_t>::max())
- timeout_us = std::numeric_limits<uint_least32_t>::max();
-
- return wait_for(lock, timeout_us);
- }
-
- template<typename M, typename P>
- bool wait_for(std::unique_lock<M> &lock,
- std::chrono::steady_clock::duration timeout,
- P &&predicate) noexcept {
- while (!predicate()) {
- // TODO: without wait_until(), this multiplies the timeout
- if (!wait_for(lock, timeout))
- return predicate();
- }
-
- return true;
- }
-};
-
-#endif
diff --git a/src/thread/PosixMutex.hxx b/src/thread/PosixMutex.hxx
deleted file mode 100644
index 37157d724..000000000
--- a/src/thread/PosixMutex.hxx
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2009-2015 Max Kellermann <max.kellermann@gmail.com>
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * - Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *
- * - Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the
- * distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
- * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
- * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
- * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
- * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
- * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
- * OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#ifndef THREAD_POSIX_MUTEX_HXX
-#define THREAD_POSIX_MUTEX_HXX
-
-#include <pthread.h>
-
-/**
- * Low-level wrapper for a pthread_mutex_t.
- */
-class PosixMutex {
- friend class PosixCond;
-
- pthread_mutex_t mutex;
-
-public:
-#if defined(__GLIBC__) && !defined(__gnu_hurd__)
- /* optimized constexpr constructor for pthread implementations
- that support it */
- constexpr PosixMutex():mutex(PTHREAD_MUTEX_INITIALIZER) {}
-#else
- /* slow fallback for pthread implementations that are not
- compatible with "constexpr" */
- PosixMutex() noexcept {
- pthread_mutex_init(&mutex, nullptr);
- }
-
- ~PosixMutex() noexcept {
- pthread_mutex_destroy(&mutex);
- }
-#endif
-
- PosixMutex(const PosixMutex &other) = delete;
- PosixMutex &operator=(const PosixMutex &other) = delete;
-
- void lock() noexcept {
- pthread_mutex_lock(&mutex);
- }
-
- bool try_lock() noexcept {
- return pthread_mutex_trylock(&mutex) == 0;
- }
-
- void unlock() noexcept {
- pthread_mutex_unlock(&mutex);
- }
-};
-
-#endif