diff --git a/components/net/cpp/include/ftl/net/universe.hpp b/components/net/cpp/include/ftl/net/universe.hpp index 8cf1c462f7a52e225170fbf8a6c59f854688bc77..b45163006d9755c3c3a713a23b1b9ccdf704cb8c 100644 --- a/components/net/cpp/include/ftl/net/universe.hpp +++ b/components/net/cpp/include/ftl/net/universe.hpp @@ -217,6 +217,7 @@ class Universe : public ftl::Configurable { std::thread thread_; std::list<ReconnectInfo> reconnects_; size_t phase_; + std::list<ftl::net::Peer*> garbage_; struct ConnHandler { callback_t id; diff --git a/components/net/cpp/src/universe.cpp b/components/net/cpp/src/universe.cpp index 541131085a7215a021d30ccc28b1dd9072426bb9..8c50709e2d6253f73849f5560c72eee9a6ff5b83 100644 --- a/components/net/cpp/src/universe.cpp +++ b/components/net/cpp/src/universe.cpp @@ -170,6 +170,14 @@ void Universe::_installBindings() { // Note: should be called inside a net lock void Universe::_cleanupPeers() { + if (ftl::pool.n_idle() == ftl::pool.size()) { + if (garbage_.size() > 0) LOG(INFO) << "Garbage collection"; + while (garbage_.size() > 0) { + delete garbage_.front(); + garbage_.pop_front(); + } + } + auto i = peers_.begin(); while (i != peers_.end()) { if (!(*i)->isValid()) { @@ -185,7 +193,8 @@ void Universe::_cleanupPeers() { if (p->status() == ftl::net::Peer::kReconnecting) { reconnects_.push_back({50, 1.0f, p}); } else { - delete p; + //delete p; + garbage_.push_back(p); } } else { i++; @@ -210,7 +219,8 @@ void Universe::_periodic() { (*i).tries--; i++; } else { - delete (*i).peer; + //delete (*i).peer; + garbage_.push_back((*i).peer); i = reconnects_.erase(i); LOG(WARNING) << "Reconnection to peer failed"; }