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