From b8e08bc990199b004d4b3b05c5040d605f2af691 Mon Sep 17 00:00:00 2001 From: AntonBikineev Date: Tue, 14 Jul 2015 03:22:55 +0300 Subject: [PATCH 1/2] Use of shared_ptr in io_service_pool changed to unique_ptr --- hpx/util/io_service_pool.hpp | 9 ++++----- src/util/io_service_pool.cpp | 28 ++++++++++------------------ 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/hpx/util/io_service_pool.hpp b/hpx/util/io_service_pool.hpp index 3c28917675fd..e68d3e89e2be 100644 --- a/hpx/util/io_service_pool.hpp +++ b/hpx/util/io_service_pool.hpp @@ -14,12 +14,12 @@ #include #include +#include #include #include #include #include -#include /////////////////////////////////////////////////////////////////////////////// namespace hpx { namespace util @@ -89,17 +89,16 @@ namespace hpx { namespace util void clear_locked(); private: - typedef boost::shared_ptr io_service_ptr; - typedef boost::shared_ptr work_ptr; + typedef std::unique_ptr io_service_ptr; boost::mutex mtx_; /// The pool of io_services. std::vector io_services_; - std::vector > threads_; + std::vector threads_; /// The work that keeps the io_services running. - std::vector work_; + std::vector work_; /// The next io_service to use for a connection. std::size_t next_io_service_; diff --git a/src/util/io_service_pool.cpp b/src/util/io_service_pool.cpp index 0aba27cc93bf..e1df760c20fb 100644 --- a/src/util/io_service_pool.cpp +++ b/src/util/io_service_pool.cpp @@ -43,10 +43,8 @@ namespace hpx { namespace util // will not exit until they are explicitly stopped. for (std::size_t i = 0; i < pool_size; ++i) { - io_service_ptr io_service(new boost::asio::io_service); - work_ptr work(new boost::asio::io_service::work(*io_service)); - io_services_.push_back(io_service); - work_.push_back(work); + io_services_.emplace_back(new boost::asio::io_service); + work_.emplace_back(boost::asio::io_service::work(*io_services_[i])); } } @@ -61,10 +59,8 @@ namespace hpx { namespace util { for (std::size_t i = 0; i < pool_size_; ++i) { - io_service_ptr io_service(new boost::asio::io_service); - work_ptr work(new boost::asio::io_service::work(*io_service)); - io_services_.push_back(io_service); - work_.push_back(work); + io_services_.emplace_back(new boost::asio::io_service); + work_.emplace_back(boost::asio::io_service::work(*io_services_[i])); } } @@ -114,18 +110,16 @@ namespace hpx { namespace util { for (std::size_t i = 0; i < pool_size_; ++i) { - io_service_ptr io_service(new boost::asio::io_service); - work_ptr work(new boost::asio::io_service::work(*io_service)); - io_services_.push_back(io_service); - work_.push_back(work); + io_services_.emplace_back(new boost::asio::io_service); + work_.emplace_back(boost::asio::io_service::work(*io_services_[i])); } } for (std::size_t i = 0; i < pool_size_; ++i) { - boost::shared_ptr thread(new boost::thread( - boost::bind(&io_service_pool::thread_run, this, i))); - threads_.push_back(thread); + boost::thread thread(boost::bind( + &io_service_pool::thread_run, this, i)); + threads_.emplace_back(std::move(thread)); } next_io_service_ = 0; @@ -151,7 +145,7 @@ namespace hpx { namespace util { // Wait for all threads in the pool to exit. for (std::size_t i = 0; i < threads_.size(); ++i) - threads_[i]->join(); + threads_[i].join(); threads_.clear(); } @@ -165,8 +159,6 @@ namespace hpx { namespace util { if (!stopped_) { // Explicitly inform all work to exit. - for (std::size_t i = 0; i < work_.size(); ++i) - work_[i].reset(); work_.clear(); // Explicitly stop all io_services. From d3057473d9d1a51214bfe0beabf1c13186f24aab Mon Sep 17 00:00:00 2001 From: AntonBikineev Date: Tue, 28 Jul 2015 08:09:11 +0300 Subject: [PATCH 2/2] io_service_pool::work is adapted to old libstdc++ behaviour --- hpx/util/io_service_pool.hpp | 18 +++++++++++++++++- src/util/io_service_pool.cpp | 6 +++--- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/hpx/util/io_service_pool.hpp b/hpx/util/io_service_pool.hpp index e68d3e89e2be..afcd639d97b7 100644 --- a/hpx/util/io_service_pool.hpp +++ b/hpx/util/io_service_pool.hpp @@ -90,6 +90,22 @@ namespace hpx { namespace util private: typedef std::unique_ptr io_service_ptr; +#if (defined(HPX_GCC_VERSION) && HPX_GCC_VERSION < 40700) + typedef std::unique_ptr work_type; +#else + typedef boost::asio::io_service::work work_type; +#endif + + BOOST_FORCEINLINE work_type initialize_work(boost::asio::io_service& io_service) + { + return work_type( +#if (defined(HPX_GCC_VERSION) && HPX_GCC_VERSION < 40700) + new boost::asio::io_service::work(io_service) +#else + io_service +#endif + ); + } boost::mutex mtx_; @@ -98,7 +114,7 @@ namespace hpx { namespace util std::vector threads_; /// The work that keeps the io_services running. - std::vector work_; + std::vector work_; /// The next io_service to use for a connection. std::size_t next_io_service_; diff --git a/src/util/io_service_pool.cpp b/src/util/io_service_pool.cpp index e1df760c20fb..0614fed7adb8 100644 --- a/src/util/io_service_pool.cpp +++ b/src/util/io_service_pool.cpp @@ -44,7 +44,7 @@ namespace hpx { namespace util for (std::size_t i = 0; i < pool_size; ++i) { io_services_.emplace_back(new boost::asio::io_service); - work_.emplace_back(boost::asio::io_service::work(*io_services_[i])); + work_.emplace_back(initialize_work(*io_services_[i])); } } @@ -60,7 +60,7 @@ namespace hpx { namespace util for (std::size_t i = 0; i < pool_size_; ++i) { io_services_.emplace_back(new boost::asio::io_service); - work_.emplace_back(boost::asio::io_service::work(*io_services_[i])); + work_.emplace_back(initialize_work(*io_services_[i])); } } @@ -111,7 +111,7 @@ namespace hpx { namespace util for (std::size_t i = 0; i < pool_size_; ++i) { io_services_.emplace_back(new boost::asio::io_service); - work_.emplace_back(boost::asio::io_service::work(*io_services_[i])); + work_.emplace_back(initialize_work(*io_services_[i])); } }