// Copyright (C) 2013,2014 Vicente J. Botet Escriba // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // 2013/09 Vicente J. Botet Escriba // Adapt to boost from CCIA C++11 implementation #ifndef BOOST_THREAD_EXECUTORS_EXECUTOR_HPP #define BOOST_THREAD_EXECUTORS_EXECUTOR_HPP #include #include #include #include #include namespace boost { namespace executors { class executor { public: /// type-erasure to store the works to do typedef executors::work work; /// executor is not copyable. BOOST_THREAD_NO_COPYABLE(executor) executor() {} /** * \par Effects * Destroys the executor. * * \par Synchronization * The completion of all the closures happen before the completion of the executor destructor. */ virtual ~executor() {}; /** * \par Effects * Close the \c executor for submissions. * The worker threads will work until there is no more closures to run. */ virtual void close() = 0; /** * \par Returns * Whether the pool is closed for submissions. */ virtual bool closed() = 0; /** * \par Effects * The specified closure will be scheduled for execution at some point in the future. * If invoked closure throws an exception the executor will call std::terminate, as is the case with threads. * * \par Synchronization * Ccompletion of closure on a particular thread happens before destruction of thread's thread local variables. * * \par Throws * \c sync_queue_is_closed if the thread pool is closed. * Whatever exception that can be throw while storing the closure. */ virtual void submit(BOOST_THREAD_RV_REF(work) closure) = 0; // virtual void submit(work& closure) = 0; /** * \par Requires * \c Closure is a model of Callable(void()) and a model of CopyConstructible/MoveConstructible. * * \par Effects * The specified closure will be scheduled for execution at some point in the future. * If invoked closure throws an exception the thread pool will call std::terminate, as is the case with threads. * * \par Synchronization * Completion of closure on a particular thread happens before destruction of thread's thread local variables. * * \par Throws * \c sync_queue_is_closed if the thread pool is closed. * Whatever exception that can be throw while storing the closure. */ #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) template void submit(Closure & closure) { work w ((closure)); submit(boost::move(w)); } #endif void submit(void (*closure)()) { work w ((closure)); submit(boost::move(w)); } template void submit(BOOST_THREAD_RV_REF(Closure) closure) { work w = boost::move(closure); submit(boost::move(w)); } /** * \par Effects * Try to execute one task. * * \par Returns * Whether a task has been executed. * * \par Throws * Whatever the current task constructor throws or the task() throws. */ virtual bool try_executing_one() = 0; /** * \par Requires * This must be called from an scheduled task. * * \par Effects * Reschedule functions until pred() */ template bool reschedule_until(Pred const& pred) { do { //schedule_one_or_yield(); if ( ! try_executing_one()) { return false; } } while (! pred()); return true; } }; } using executors::executor; } #include #endif