From e304d0f8ee404ef7e1223a324012d4fb4049185d Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 13 Sep 2014 11:26:17 +0200 Subject: thread/Posix{Cond,Mutex}: don't ues PTHREAD_*_INITIALIZER on NetBSD On NetBSD, PTHREAD_MUTEX_INITIALIZER and PTHREAD_COND_INITIALIZER are not compatible with C++11 "constexpr" (see Mantis ticket 0004110). As a workaround, don't ues "constexpr", and use the functions pthread_mutex_init(), pthread_mutex_destroy(), pthread_cond_init() and pthread_cond_destroy() instead. This adds some runtime overhead, but is portable to POSIX implementations that have awkward initializer macros. --- src/thread/PosixMutex.hxx | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'src/thread/PosixMutex.hxx') diff --git a/src/thread/PosixMutex.hxx b/src/thread/PosixMutex.hxx index d50764af4..445c0ace2 100644 --- a/src/thread/PosixMutex.hxx +++ b/src/thread/PosixMutex.hxx @@ -41,7 +41,21 @@ class PosixMutex { pthread_mutex_t mutex; public: +#ifdef __NetBSD__ + /* NetBSD's PTHREAD_MUTEX_INITIALIZER is not compatible with + "constexpr" */ + PosixMutex() { + pthread_mutex_init(&mutex, nullptr); + } + + ~PosixMutex() { + pthread_mutex_destroy(&mutex); + } +#else + /* optimized constexpr constructor for sane POSIX + implementations */ constexpr PosixMutex():mutex(PTHREAD_MUTEX_INITIALIZER) {} +#endif PosixMutex(const PosixMutex &other) = delete; PosixMutex &operator=(const PosixMutex &other) = delete; -- cgit v1.2.3