diff options
author | Riccardo Spagni <ric@spagni.net> | 2015-12-22 14:42:34 +0200 |
---|---|---|
committer | Riccardo Spagni <ric@spagni.net> | 2015-12-22 14:42:37 +0200 |
commit | e6dbea094c79058a3272b5d713b69095eb15aac7 (patch) | |
tree | bd220d60d507b28e54f217f2eb950520f70220b9 /contrib/epee | |
parent | Merge pull request #552 (diff) | |
parent | epee: fix hang on exit (diff) | |
download | monero-e6dbea094c79058a3272b5d713b69095eb15aac7.tar.xz |
Merge pull request #553
1e2f2d7 epee: fix hang on exit (moneromooo-monero)
17ff6f2 net_node: fix a hang on exit (moneromooo-monero)
Diffstat (limited to 'contrib/epee')
-rw-r--r-- | contrib/epee/include/net/abstract_tcp_server2.h | 5 | ||||
-rw-r--r-- | contrib/epee/include/net/abstract_tcp_server2.inl | 21 |
2 files changed, 25 insertions, 1 deletions
diff --git a/contrib/epee/include/net/abstract_tcp_server2.h b/contrib/epee/include/net/abstract_tcp_server2.h index 8043c0876..77396ade4 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<connection_ptr> 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 b75a9ecaa..cb8bdc6ee 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<t_protocol_handler>::close", false); } - + //--------------------------------------------------------------------------------- + template<class t_protocol_handler> + bool connection<t_protocol_handler>::cancel() + { + return close(); + } //--------------------------------------------------------------------------------- template<class t_protocol_handler> void connection<t_protocol_handler>::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<t_protocol_handler>::send_stop_signal()", void()); } @@ -914,6 +925,10 @@ POP_WARNINGS TRY_ENTRY(); connection_ptr new_connection_l(new connection<t_protocol_handler>(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<t_protocol_handler>(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(); ////////////////////////////////////////////////////////////////////////// |