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.
This commit is contained in:
Max Kellermann 2014-09-13 11:26:17 +02:00
parent ab7b38d4b9
commit e304d0f8ee
4 changed files with 30 additions and 1 deletions

1
NEWS
View File

@ -1,4 +1,5 @@
ver 0.18.15 (not yet released)
* work around build failure on NetBSD
ver 0.18.14 (2014/09/11)
* protocol

View File

@ -28,7 +28,7 @@ struct notify {
Cond cond;
bool pending;
#ifndef WIN32
#if !defined(WIN32) && !defined(__NetBSD__)
constexpr
#endif
notify():pending(false) {}

View File

@ -41,7 +41,21 @@ class PosixCond {
pthread_cond_t cond;
public:
#ifdef __NetBSD__
/* NetBSD's PTHREAD_COND_INITIALIZER is not compatible with
"constexpr" */
PosixCond() {
pthread_cond_init(&cond, nullptr);
}
~PosixCond() {
pthread_cond_destroy(&cond);
}
#else
/* optimized constexpr constructor for sane POSIX
implementations */
constexpr PosixCond():cond(PTHREAD_COND_INITIALIZER) {}
#endif
PosixCond(const PosixCond &other) = delete;
PosixCond &operator=(const PosixCond &other) = delete;

View File

@ -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;