From c83ea952408fdfafb051a954d0c6ab5dd22f8d29 Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nicolas.pope@utu.fi> Date: Sun, 28 Jul 2019 11:59:59 +0300 Subject: [PATCH] Resolves #142 Garbage collect peer objects --- components/net/cpp/include/ftl/net/universe.hpp | 1 + components/net/cpp/src/universe.cpp | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/components/net/cpp/include/ftl/net/universe.hpp b/components/net/cpp/include/ftl/net/universe.hpp index 8cf1c462f..b45163006 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 541131085..8c50709e2 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"; } -- GitLab