00001 /* vim: set sw=4 sts=4 et foldmethod=syntax : */ 00002 00003 /* 00004 * Copyright (c) 2007, 2008 Ciaran McCreesh 00005 * 00006 * This file is part of the Paludis package manager. Paludis is free software; 00007 * you can redistribute it and/or modify it under the terms of the GNU General 00008 * Public License version 2, as published by the Free Software Foundation. 00009 * 00010 * Paludis is distributed in the hope that it will be useful, but WITHOUT ANY 00011 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS 00012 * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 00013 * details. 00014 * 00015 * You should have received a copy of the GNU General Public License along with 00016 * this program; if not, write to the Free Software Foundation, Inc., 59 Temple 00017 * Place, Suite 330, Boston, MA 02111-1307 USA 00018 */ 00019 00020 #ifndef PALUDIS_GUARD_PALUDIS_UTIL_CONDITION_VARIABLE_HH 00021 #define PALUDIS_GUARD_PALUDIS_UTIL_CONDITION_VARIABLE_HH 1 00022 00023 #include <paludis/util/attributes.hh> 00024 #include <paludis/util/mutex.hh> 00025 #include <pthread.h> 00026 00027 /** \file 00028 * Declarations for the ConditionVariable class. 00029 * 00030 * \ingroup g_threads 00031 * 00032 * \section Examples 00033 * 00034 * - None at this time. 00035 */ 00036 00037 namespace paludis 00038 { 00039 /** 00040 * A basic condition variable. 00041 * 00042 * If threading is disabled, waiting and signalling are no-ops. 00043 * 00044 * \ingroup g_threads 00045 * \since 0.26 00046 * \nosubgrouping 00047 */ 00048 class PALUDIS_VISIBLE ConditionVariable 00049 { 00050 private: 00051 ConditionVariable(const ConditionVariable &); 00052 ConditionVariable & operator= (const ConditionVariable &); 00053 00054 pthread_cond_t * const _cond; 00055 00056 public: 00057 ///\name Basic operations 00058 ///\{ 00059 00060 ConditionVariable(); 00061 ~ConditionVariable(); 00062 00063 ///\} 00064 00065 /** 00066 * Broadcast to all waiting threads. 00067 */ 00068 void broadcast(); 00069 00070 /** 00071 * Signal one waiting thread. 00072 */ 00073 void signal(); 00074 00075 /** 00076 * Acquire the specified Mutex, then signal. 00077 */ 00078 void acquire_then_signal(Mutex &); 00079 00080 /** 00081 * Wait, using the specified Mutex for synchronisation. 00082 */ 00083 void wait(Mutex &); 00084 00085 /** 00086 * Wait, using the specified Mutex for synchronisation, 00087 * but return false if more than n seconds elapse. 00088 */ 00089 bool timed_wait(Mutex &, const unsigned n); 00090 }; 00091 } 00092 00093 #endif