annotate DEPENDENCIES/generic/include/boost/thread/executors/thread_executor.hpp @ 125:34e428693f5d vext

Vext -> Repoint
author Chris Cannam
date Thu, 14 Jun 2018 11:15:39 +0100
parents f46d142149f5
children
rev   line source
Chris@102 1 // Copyright (C) 2014 Vicente J. Botet Escriba
Chris@102 2 //
Chris@102 3 // Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@102 4 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@102 5 //
Chris@102 6 // 2014/01 Vicente J. Botet Escriba
Chris@102 7 // first implementation of a thread_executor.
Chris@102 8
Chris@102 9 #ifndef BOOST_THREAD_THREAD_EXECUTOR_HPP
Chris@102 10 #define BOOST_THREAD_THREAD_EXECUTOR_HPP
Chris@102 11
Chris@102 12 #include <boost/thread/detail/config.hpp>
Chris@102 13 #include <boost/thread/detail/delete.hpp>
Chris@102 14 #include <boost/thread/detail/move.hpp>
Chris@102 15 #include <boost/thread/executors/work.hpp>
Chris@102 16 #include <boost/thread/executors/executor.hpp>
Chris@102 17 #include <boost/thread/thread_only.hpp>
Chris@102 18 #include <boost/thread/scoped_thread.hpp>
Chris@102 19 #include <boost/thread/csbl/vector.hpp>
Chris@102 20
Chris@102 21 #include <boost/config/abi_prefix.hpp>
Chris@102 22
Chris@102 23 namespace boost
Chris@102 24 {
Chris@102 25 namespace executors
Chris@102 26 {
Chris@102 27 class thread_executor
Chris@102 28 {
Chris@102 29 public:
Chris@102 30 /// type-erasure to store the works to do
Chris@102 31 typedef executors::work work;
Chris@102 32 bool closed_;
Chris@102 33 typedef scoped_thread<> thread_t;
Chris@102 34 typedef csbl::vector<thread_t> threads_type;
Chris@102 35 threads_type threads_;
Chris@102 36 mutable mutex mtx_;
Chris@102 37
Chris@102 38 /**
Chris@102 39 * Effects: try to execute one task.
Chris@102 40 * Returns: whether a task has been executed.
Chris@102 41 * Throws: whatever the current task constructor throws or the task() throws.
Chris@102 42 */
Chris@102 43 bool try_executing_one()
Chris@102 44 {
Chris@102 45 return false;
Chris@102 46 }
Chris@102 47
Chris@102 48 public:
Chris@102 49 /// thread_executor is not copyable.
Chris@102 50 BOOST_THREAD_NO_COPYABLE(thread_executor)
Chris@102 51
Chris@102 52 /**
Chris@102 53 * \b Effects: creates a inline executor that runs closures immediately.
Chris@102 54 *
Chris@102 55 * \b Throws: Nothing.
Chris@102 56 */
Chris@102 57 thread_executor()
Chris@102 58 : closed_(false)
Chris@102 59 {
Chris@102 60 }
Chris@102 61 /**
Chris@102 62 * \b Effects: Waits for closures (if any) to complete, then joins and destroys the threads.
Chris@102 63 *
Chris@102 64 * \b Synchronization: The completion of all the closures happen before the completion of the \c thread_executor destructor.
Chris@102 65 */
Chris@102 66 ~thread_executor()
Chris@102 67 {
Chris@102 68 // signal to all the worker thread that there will be no more submissions.
Chris@102 69 close();
Chris@102 70 // all the scoped threads will join before destroying
Chris@102 71 }
Chris@102 72
Chris@102 73 /**
Chris@102 74 * \b Effects: close the \c thread_executor for submissions.
Chris@102 75 * The loop will work until there is no more closures to run.
Chris@102 76 */
Chris@102 77 void close()
Chris@102 78 {
Chris@102 79 lock_guard<mutex> lk(mtx_);
Chris@102 80 closed_ = true;
Chris@102 81 }
Chris@102 82
Chris@102 83 /**
Chris@102 84 * \b Returns: whether the pool is closed for submissions.
Chris@102 85 */
Chris@102 86 bool closed(lock_guard<mutex>& )
Chris@102 87 {
Chris@102 88 return closed_;
Chris@102 89 }
Chris@102 90 bool closed()
Chris@102 91 {
Chris@102 92 lock_guard<mutex> lk(mtx_);
Chris@102 93 return closed(lk);
Chris@102 94 }
Chris@102 95
Chris@102 96 /**
Chris@102 97 * \b Requires: \c Closure is a model of \c Callable(void()) and a model of \c CopyConstructible/MoveConstructible.
Chris@102 98 *
Chris@102 99 * \b Effects: The specified \c closure will be scheduled for execution at some point in the future.
Chris@102 100 * If invoked closure throws an exception the \c thread_executor will call \c std::terminate, as is the case with threads.
Chris@102 101 *
Chris@102 102 * \b Synchronization: completion of \c closure on a particular thread happens before destruction of thread's thread local variables.
Chris@102 103 *
Chris@102 104 * \b Throws: \c sync_queue_is_closed if the thread pool is closed.
Chris@102 105 * Whatever exception that can be throw while storing the closure.
Chris@102 106 */
Chris@102 107
Chris@102 108 #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
Chris@102 109 template <typename Closure>
Chris@102 110 void submit(Closure & closure)
Chris@102 111 {
Chris@102 112 lock_guard<mutex> lk(mtx_);
Chris@102 113 if (closed(lk)) BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
Chris@102 114 threads_.reserve(threads_.size() + 1);
Chris@102 115 thread th(closure);
Chris@102 116 threads_.push_back(thread_t(boost::move(th)));
Chris@102 117 }
Chris@102 118 #endif
Chris@102 119 void submit(void (*closure)())
Chris@102 120 {
Chris@102 121 lock_guard<mutex> lk(mtx_);
Chris@102 122 if (closed(lk)) BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
Chris@102 123 threads_.reserve(threads_.size() + 1);
Chris@102 124 thread th(closure);
Chris@102 125 threads_.push_back(thread_t(boost::move(th)));
Chris@102 126 }
Chris@102 127
Chris@102 128 template <typename Closure>
Chris@102 129 void submit(BOOST_THREAD_FWD_REF(Closure) closure)
Chris@102 130 {
Chris@102 131 lock_guard<mutex> lk(mtx_);
Chris@102 132 if (closed(lk)) BOOST_THROW_EXCEPTION( sync_queue_is_closed() );
Chris@102 133 threads_.reserve(threads_.size() + 1);
Chris@102 134 thread th(boost::forward<Closure>(closure));
Chris@102 135 threads_.push_back(thread_t(boost::move(th)));
Chris@102 136 }
Chris@102 137
Chris@102 138 /**
Chris@102 139 * \b Requires: This must be called from an scheduled task.
Chris@102 140 *
Chris@102 141 * \b Effects: reschedule functions until pred()
Chris@102 142 */
Chris@102 143 template <typename Pred>
Chris@102 144 bool reschedule_until(Pred const&)
Chris@102 145 {
Chris@102 146 return false;
Chris@102 147 }
Chris@102 148
Chris@102 149 };
Chris@102 150 }
Chris@102 151 using executors::thread_executor;
Chris@102 152 }
Chris@102 153
Chris@102 154 #include <boost/config/abi_suffix.hpp>
Chris@102 155
Chris@102 156 #endif