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:
		| @@ -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; | ||||
|   | ||||
| @@ -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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann