thread/Cond: new wrapper for pthread_cond_t or GCond
This commit is contained in:
		| @@ -164,6 +164,9 @@ src_mpd_SOURCES = \ | ||||
| 	src/thread/Mutex.hxx \ | ||||
| 	src/thread/PosixMutex.hxx \ | ||||
| 	src/thread/GLibMutex.hxx \ | ||||
| 	src/thread/Cond.hxx \ | ||||
| 	src/thread/PosixCond.hxx \ | ||||
| 	src/thread/GLibCond.hxx \ | ||||
| 	src/glib_socket.h \ | ||||
| 	src/clock.c src/clock.h \ | ||||
| 	src/notify.c \ | ||||
|   | ||||
							
								
								
									
										37
									
								
								src/thread/Cond.hxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								src/thread/Cond.hxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| /* | ||||
|  * Copyright (C) 2003-2013 The Music Player Daemon Project | ||||
|  * http://www.musicpd.org | ||||
|  * | ||||
|  * This program is free software; you can redistribute it and/or modify | ||||
|  * it under the terms of the GNU General Public License as published by | ||||
|  * the Free Software Foundation; either version 2 of the License, or | ||||
|  * (at your option) any later version. | ||||
|  * | ||||
|  * This program is distributed in the hope that it will be useful, | ||||
|  * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||
|  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||
|  * GNU General Public License for more details. | ||||
|  * | ||||
|  * You should have received a copy of the GNU General Public License along | ||||
|  * with this program; if not, write to the Free Software Foundation, Inc., | ||||
|  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. | ||||
|  */ | ||||
|  | ||||
| #ifndef MPD_THREAD_COND_HXX | ||||
| #define MPD_THREAD_COND_HXX | ||||
|  | ||||
| #ifdef WIN32 | ||||
|  | ||||
| /* mingw-w64 4.6.3 lacks a std::cond implementation */ | ||||
|  | ||||
| #include "GLibCond.hxx" | ||||
| typedef GLibCond Cond; | ||||
|  | ||||
| #else | ||||
|  | ||||
| #include "PosixCond.hxx" | ||||
| typedef PosixCond Cond; | ||||
|  | ||||
| #endif | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										88
									
								
								src/thread/GLibCond.hxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										88
									
								
								src/thread/GLibCond.hxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,88 @@ | ||||
| /* | ||||
|  * Copyright (C) 2013 Max Kellermann <max@duempel.org> | ||||
|  * | ||||
|  * 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 MPD_THREAD_GLIB_COND_HXX | ||||
| #define MPD_THREAD_GLIB_COND_HXX | ||||
|  | ||||
| #include "GLibMutex.hxx" | ||||
|  | ||||
| /** | ||||
|  * A wrapper for GCond. | ||||
|  */ | ||||
| class GLibCond { | ||||
| #if GLIB_CHECK_VERSION(2,32,0) | ||||
| 	GCond cond; | ||||
| #else | ||||
| 	GCond *cond; | ||||
| #endif | ||||
|  | ||||
| public: | ||||
| 	GLibCond() { | ||||
| #if GLIB_CHECK_VERSION(2,32,0) | ||||
| 		g_cond_init(&cond); | ||||
| #else | ||||
| 		cond = g_cond_new(); | ||||
| #endif | ||||
| 	} | ||||
|  | ||||
| 	~GLibCond() { | ||||
| #if GLIB_CHECK_VERSION(2,32,0) | ||||
| 		g_cond_clear(&cond); | ||||
| #else | ||||
| 		g_cond_free(cond); | ||||
| #endif | ||||
| 	} | ||||
|  | ||||
| 	GLibCond(const GLibCond &other) = delete; | ||||
| 	GLibCond &operator=(const GLibCond &other) = delete; | ||||
|  | ||||
| private: | ||||
| 	GCond *GetNative() { | ||||
| #if GLIB_CHECK_VERSION(2,32,0) | ||||
| 		return &cond; | ||||
| #else | ||||
| 		return cond; | ||||
| #endif | ||||
| 	} | ||||
|  | ||||
| public: | ||||
| 	void signal() { | ||||
| 		g_cond_signal(GetNative()); | ||||
| 	} | ||||
|  | ||||
| 	void broadcast() { | ||||
| 		g_cond_broadcast(GetNative()); | ||||
| 	} | ||||
|  | ||||
| 	void wait(GLibMutex &mutex) { | ||||
| 		g_cond_wait(GetNative(), mutex.GetNative()); | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| #endif | ||||
| @@ -36,6 +36,8 @@ | ||||
|  * A wrapper for GMutex. | ||||
|  */ | ||||
| class GLibMutex { | ||||
| 	friend class GLibCond; | ||||
|  | ||||
| #if GLIB_CHECK_VERSION(2,32,0) | ||||
| 	GMutex mutex; | ||||
| #else | ||||
|   | ||||
							
								
								
									
										60
									
								
								src/thread/PosixCond.hxx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								src/thread/PosixCond.hxx
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,60 @@ | ||||
| /* | ||||
|  * Copyright (C) 2009-2013 Max Kellermann <max@duempel.org> | ||||
|  * | ||||
|  * 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 MPD_THREAD_POSIX_COND_HXX | ||||
| #define MPD_THREAD_POSIX_COND_HXX | ||||
|  | ||||
| #include "PosixMutex.hxx" | ||||
|  | ||||
| /** | ||||
|  * Low-level wrapper for a pthread_cond_t. | ||||
|  */ | ||||
| class PosixCond { | ||||
| 	pthread_cond_t cond; | ||||
|  | ||||
| public: | ||||
| 	constexpr PosixCond():cond(PTHREAD_COND_INITIALIZER) {} | ||||
|  | ||||
| 	PosixCond(const PosixCond &other) = delete; | ||||
| 	PosixCond &operator=(const PosixCond &other) = delete; | ||||
|  | ||||
| 	void signal() { | ||||
| 		pthread_cond_signal(&cond); | ||||
| 	} | ||||
|  | ||||
| 	void broadcast() { | ||||
| 		pthread_cond_broadcast(&cond); | ||||
| 	} | ||||
|  | ||||
| 	void wait(PosixMutex &mutex) { | ||||
| 		pthread_cond_wait(&cond, &mutex.mutex); | ||||
| 	} | ||||
| }; | ||||
|  | ||||
| #endif | ||||
| @@ -36,6 +36,8 @@ | ||||
|  * Low-level wrapper for a pthread_mutex_t. | ||||
|  */ | ||||
| class PosixMutex { | ||||
| 	friend class PosixCond; | ||||
|  | ||||
| 	pthread_mutex_t mutex; | ||||
|  | ||||
| public: | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Max Kellermann
					Max Kellermann