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_ACTION_QUEUE_HH 00021 #define PALUDIS_GUARD_PALUDIS_UTIL_ACTION_QUEUE_HH 1 00022 00023 #include <paludis/util/private_implementation_pattern.hh> 00024 #include <tr1/functional> 00025 00026 namespace paludis 00027 { 00028 /** 00029 * An ActionQueue consists of a number of threads that take tasks from a 00030 * queue. 00031 * 00032 * If threads are disabled, enqueueing an item executes it immediately. 00033 * 00034 * \ingroup g_threads 00035 * \since 0.26 00036 * \nosubgrouping 00037 */ 00038 class PALUDIS_VISIBLE ActionQueue : 00039 private PrivateImplementationPattern<ActionQueue> 00040 { 00041 public: 00042 ///\name Basic operations 00043 ///\{ 00044 00045 ActionQueue(const unsigned n_threads = 1, const bool nice = false, const bool limit_size = true); 00046 ~ActionQueue(); 00047 00048 ///\} 00049 00050 /** 00051 * Enqueue an item. 00052 */ 00053 void enqueue(const std::tr1::function<void () throw ()> &); 00054 00055 /** 00056 * Complete any pending tasks. 00057 */ 00058 void complete_pending(); 00059 00060 /** 00061 * Forget any pending tasks. 00062 */ 00063 void forget_pending(); 00064 00065 /** 00066 * How many threads do we have? 00067 */ 00068 unsigned number_of_threads() const; 00069 }; 00070 00071 #ifdef PALUDIS_HAVE_EXTERN_TEMPLATE 00072 extern template class PrivateImplementationPattern<ActionQueue>; 00073 #endif 00074 00075 } 00076 00077 #endif