| // |
| // io_context_pool.hpp |
| // ~~~~~~~~~~~~~~~~~~~ |
| // |
| // Copyright (c) 2003-2016 Christopher M. Kohlhoff (chris at kohlhoff dot com) |
| // |
| // 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) |
| // |
| |
| #ifndef HTTP_SERVER2_IO_SERVICE_POOL_HPP |
| #define HTTP_SERVER2_IO_SERVICE_POOL_HPP |
| |
| #include <asio.hpp> |
| #include <vector> |
| #include <boost/noncopyable.hpp> |
| #include <boost/shared_ptr.hpp> |
| |
| namespace http { |
| namespace server2 { |
| |
| /// A pool of io_context objects. |
| class io_context_pool |
| : private boost::noncopyable |
| { |
| public: |
| /// Construct the io_context pool. |
| explicit io_context_pool(std::size_t pool_size); |
| |
| /// Run all io_context objects in the pool. |
| void run(); |
| |
| /// Stop all io_context objects in the pool. |
| void stop(); |
| |
| /// Get an io_context to use. |
| asio::io_context& get_io_context(); |
| |
| private: |
| typedef boost::shared_ptr<asio::io_context> io_context_ptr; |
| typedef asio::executor_work_guard< |
| asio::io_context::executor_type> io_context_work; |
| typedef boost::shared_ptr<io_context_work> work_ptr; |
| |
| /// The pool of io_contexts. |
| std::vector<io_context_ptr> io_contexts_; |
| |
| /// The work that keeps the io_contexts running. |
| std::vector<work_ptr> work_; |
| |
| /// The next io_context to use for a connection. |
| std::size_t next_io_context_; |
| }; |
| |
| } // namespace server2 |
| } // namespace http |
| |
| #endif // HTTP_SERVER2_IO_SERVICE_POOL_HPP |