diff options
author | Max Kellermann <max@musicpd.org> | 2019-04-25 18:37:08 +0200 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2019-05-07 19:57:53 +0200 |
commit | 230ca2e968e2e4f98e944026413cb7720c7d988b (patch) | |
tree | 4e2e0444dca486a831b09eac75aeb0827b6d3b35 /src/thread | |
parent | 9095167039592088c10c251b99c4d3ade6a59a8e (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.hxx | 4 | ||||
-rw-r--r-- | src/thread/Mutex.hxx | 3 | ||||
-rw-r--r-- | src/thread/PosixCond.hxx | 123 | ||||
-rw-r--r-- | src/thread/PosixMutex.hxx | 76 |
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 |