From f4502c5fc000124ccadba84d5f456f98ee4ab582 Mon Sep 17 00:00:00 2001
From: Sebastian Hahta <joseha@utu.fi>
Date: Tue, 28 Jan 2020 14:34:44 +0200
Subject: [PATCH] add count to findOne()

---
 components/net/cpp/include/ftl/net/universe.hpp | 15 +++++++++------
 1 file changed, 9 insertions(+), 6 deletions(-)

diff --git a/components/net/cpp/include/ftl/net/universe.hpp b/components/net/cpp/include/ftl/net/universe.hpp
index aaf1c39d3..9bd17cc4e 100644
--- a/components/net/cpp/include/ftl/net/universe.hpp
+++ b/components/net/cpp/include/ftl/net/universe.hpp
@@ -262,7 +262,7 @@ void Universe::bind(const std::string &name, F func) {
 	UNIQUE_LOCK(net_mutex_,lk);
 	disp_.bind(name, func,
 		typename ftl::internal::func_kind_info<F>::result_kind(),
-	    typename ftl::internal::func_kind_info<F>::args_kind(),
+		typename ftl::internal::func_kind_info<F>::args_kind(),
 		typename ftl::internal::func_kind_info<F>::has_peer());
 }
 
@@ -290,11 +290,11 @@ std::optional<R> Universe::findOne(const std::string &name, ARGS... args) {
 	bool hasreturned = false;
 	std::mutex m;
 	std::condition_variable cv;
-	
+	std::atomic<int> count = 0;
 	std::optional<R> result;
 
 	auto handler = [&](const std::optional<R> &r) {
-		//UNIQUE_LOCK(m,lk);
+		count--;
 		std::unique_lock<std::mutex> lk(m);
 		if (hasreturned || !r) return;
 		hasreturned = true;
@@ -307,14 +307,17 @@ std::optional<R> Universe::findOne(const std::string &name, ARGS... args) {
 	SHARED_LOCK(net_mutex_,lk);
 
 	for (auto p : peers_) {
+		count++;
 		if (p->isConnected()) record[p] = p->asyncCall<std::optional<R>>(name, handler, args...);
 	}
 	lk.unlock();
 	
-	{  // Block thread until async callback notifies us
-		//UNIQUE_LOCK(m,llk);
+	{	// Block thread until async callback notifies us
 		std::unique_lock<std::mutex> llk(m);
-		cv.wait_for(llk, std::chrono::seconds(1), [&hasreturned]{return hasreturned;});
+		// FIXME: what happens if one clients does not return (count != 0)?
+		cv.wait_for(llk, std::chrono::seconds(1), [&hasreturned, &count] {
+			return hasreturned && count == 0;
+		});
 
 		// Cancel any further results
 		lk.lock();
-- 
GitLab