diff --git a/contrib/epee/include/net/abstract_tcp_server2.h b/contrib/epee/include/net/abstract_tcp_server2.h index 8043c087..77396ade 100644 --- a/contrib/epee/include/net/abstract_tcp_server2.h +++ b/contrib/epee/include/net/abstract_tcp_server2.h @@ -110,6 +110,8 @@ namespace net_utils bool speed_limit_is_enabled() const; ///< tells us should we be sleeping here (e.g. do not sleep on RPC connections) + + bool cancel(); private: //----------------- i_service_endpoint --------------------- @@ -303,6 +305,9 @@ namespace net_utils /// The next connection to be accepted connection_ptr new_connection_; + std::mutex connections_mutex; + std::deque connections_; + }; // class <>boosted_tcp_server diff --git a/contrib/epee/include/net/abstract_tcp_server2.inl b/contrib/epee/include/net/abstract_tcp_server2.inl index b75a9eca..cb8bdc6e 100644 --- a/contrib/epee/include/net/abstract_tcp_server2.inl +++ b/contrib/epee/include/net/abstract_tcp_server2.inl @@ -565,7 +565,12 @@ PRAGMA_WARNING_DISABLE_VS(4355) return true; CATCH_ENTRY_L0("connection::close", false); } - + //--------------------------------------------------------------------------------- + template + bool connection::cancel() + { + return close(); + } //--------------------------------------------------------------------------------- template void connection::handle_write(const boost::system::error_code& e, size_t cb) @@ -871,6 +876,12 @@ POP_WARNINGS } m_stop_signal_sent = true; TRY_ENTRY(); + connections_mutex.lock(); + for (auto &c: connections_) + { + c->cancel(); + } + connections_mutex.unlock(); io_service_.stop(); CATCH_ENTRY_L0("boosted_tcp_server::send_stop_signal()", void()); } @@ -914,6 +925,10 @@ POP_WARNINGS TRY_ENTRY(); connection_ptr new_connection_l(new connection(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type) ); + connections_mutex.lock(); + connections_.push_back(new_connection_l); + LOG_PRINT_L2("connections_ size now " << connections_.size()); + connections_mutex.unlock(); boost::asio::ip::tcp::socket& sock_ = new_connection_l->socket(); ////////////////////////////////////////////////////////////////////////// @@ -1006,6 +1021,10 @@ POP_WARNINGS { TRY_ENTRY(); connection_ptr new_connection_l(new connection(io_service_, m_config, m_sock_count, m_sock_number, m_pfilter, m_connection_type) ); + connections_mutex.lock(); + connections_.push_back(new_connection_l); + LOG_PRINT_L2("connections_ size now " << connections_.size()); + connections_mutex.unlock(); boost::asio::ip::tcp::socket& sock_ = new_connection_l->socket(); ////////////////////////////////////////////////////////////////////////// diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl index 254c9ae7..917f1826 100644 --- a/src/p2p/net_node.inl +++ b/src/p2p/net_node.inl @@ -570,7 +570,7 @@ namespace nodetool mPeersLoggerThread.reset(new std::thread([&]() { _note("Thread monitor number of peers - start"); - while (!is_closing) + while (!is_closing && !m_net_server.is_stop_signal_sent()) { // main loop of thread //number_of_peers = m_net_server.get_config_object().get_connections_count(); unsigned int number_of_peers = 0;