diff --git a/src/daemon/daemon.cpp b/src/daemon/daemon.cpp index 8d584af5..4a93a0db 100644 --- a/src/daemon/daemon.cpp +++ b/src/daemon/daemon.cpp @@ -320,7 +320,7 @@ int main(int argc, char* argv[]) ccore.set_cryptonote_protocol(NULL); cprotocol.set_p2p_endpoint(NULL); - epee::net_utils::data_logger::get_instance().kill_instance(); + epee::net_utils::data_logger::kill_instance(); LOG_PRINT("Node stopped.", LOG_LEVEL_0); return 0; diff --git a/src/p2p/data_logger.cpp b/src/p2p/data_logger.cpp index d62af133..69e50141 100644 --- a/src/p2p/data_logger.cpp +++ b/src/p2p/data_logger.cpp @@ -20,6 +20,12 @@ namespace net_utils m_state = data_logger_state::state_ready_to_use; } ); + + if (m_state != data_logger_state::state_ready_to_use) { + _erro ("trying to use not working data_logger"); + throw std::runtime_error("data_logger ctor state"); + } + return * m_obj; } @@ -82,7 +88,7 @@ namespace net_utils } void data_logger::kill_instance() { - m_state = m_state = data_logger_state::state_dying; + m_state = data_logger_state::state_dying; m_obj.reset(); } diff --git a/src/p2p/net_node.h b/src/p2p/net_node.h index 5417ffa5..5b034ce2 100644 --- a/src/p2p/net_node.h +++ b/src/p2p/net_node.h @@ -89,6 +89,7 @@ namespace nodetool { m_current_number_of_out_peers = 0; m_save_graph = false; + is_closing = false; } static void init_options(boost::program_options::options_description& desc); @@ -209,6 +210,13 @@ namespace nodetool bool set_rate_down_limit(const boost::program_options::variables_map& vm, int64_t limit); bool set_rate_limit(const boost::program_options::variables_map& vm, uint64_t limit); + void kill() { ///< will be called e.g. from deinit() + _info("Killing the net_node"); + is_closing = true; + mPeersLoggerThread->join(); // make sure the thread finishes + _info("Joined extra background net_node threads"); + } + //debug functions std::string print_connections_container(); @@ -247,7 +255,8 @@ namespace nodetool bool m_hide_my_port; bool m_no_igd; std::atomic m_save_graph; - + std::atomic is_closing; + std::unique_ptr mPeersLoggerThread; //critical_section m_connections_lock; //connections_indexed_container m_connections; diff --git a/src/p2p/net_node.inl b/src/p2p/net_node.inl index a015763b..afc6436f 100644 --- a/src/p2p/net_node.inl +++ b/src/p2p/net_node.inl @@ -291,17 +291,17 @@ namespace nodetool std::vector> dns_results; dns_results.resize(m_seed_nodes_list.size()); - std::shared_ptr peersLoggerThread (new std::thread([&]() + // creating thread to log number of connections + mPeersLoggerThread.reset(new std::thread([&]() { - unsigned int number_of_peers; - while (1) - { + _note("Thread monitor number of peers - start"); + while (!is_closing) + { // main loop of thread //number_of_peers = m_net_server.get_config_object().get_connections_count(); - number_of_peers = 0; + unsigned int number_of_peers = 0; m_net_server.get_config_object().foreach_connection([&](const p2p_connection_context& cntxt) { - if(!cntxt.m_is_income) - ++number_of_peers; + if (!cntxt.m_is_income) ++number_of_peers; return true; }); // lambda @@ -309,10 +309,10 @@ namespace nodetool epee::net_utils::data_logger::get_instance().add_data("peers", number_of_peers); std::this_thread::sleep_for(std::chrono::seconds(1)); - } + } // main loop of thread + _note("Thread monitor number of peers - done"); })); // lambda - peersLoggerThread->detach(); std::list dns_threads; uint64_t result_index = 0; @@ -509,6 +509,7 @@ namespace nodetool template bool node_server::deinit() { + kill(); m_peerlist.deinit(); m_net_server.deinit_server();