Skip to content
Snippets Groups Projects
Commit f4502c5f authored by Sebastian Hahta's avatar Sebastian Hahta
Browse files

add count to findOne()

parent 6c207703
No related branches found
No related tags found
No related merge requests found
Pipeline #19180 passed
...@@ -262,7 +262,7 @@ void Universe::bind(const std::string &name, F func) { ...@@ -262,7 +262,7 @@ void Universe::bind(const std::string &name, F func) {
UNIQUE_LOCK(net_mutex_,lk); UNIQUE_LOCK(net_mutex_,lk);
disp_.bind(name, func, disp_.bind(name, func,
typename ftl::internal::func_kind_info<F>::result_kind(), 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()); typename ftl::internal::func_kind_info<F>::has_peer());
} }
...@@ -290,11 +290,11 @@ std::optional<R> Universe::findOne(const std::string &name, ARGS... args) { ...@@ -290,11 +290,11 @@ std::optional<R> Universe::findOne(const std::string &name, ARGS... args) {
bool hasreturned = false; bool hasreturned = false;
std::mutex m; std::mutex m;
std::condition_variable cv; std::condition_variable cv;
std::atomic<int> count = 0;
std::optional<R> result; std::optional<R> result;
auto handler = [&](const std::optional<R> &r) { auto handler = [&](const std::optional<R> &r) {
//UNIQUE_LOCK(m,lk); count--;
std::unique_lock<std::mutex> lk(m); std::unique_lock<std::mutex> lk(m);
if (hasreturned || !r) return; if (hasreturned || !r) return;
hasreturned = true; hasreturned = true;
...@@ -307,14 +307,17 @@ std::optional<R> Universe::findOne(const std::string &name, ARGS... args) { ...@@ -307,14 +307,17 @@ std::optional<R> Universe::findOne(const std::string &name, ARGS... args) {
SHARED_LOCK(net_mutex_,lk); SHARED_LOCK(net_mutex_,lk);
for (auto p : peers_) { for (auto p : peers_) {
count++;
if (p->isConnected()) record[p] = p->asyncCall<std::optional<R>>(name, handler, args...); if (p->isConnected()) record[p] = p->asyncCall<std::optional<R>>(name, handler, args...);
} }
lk.unlock(); lk.unlock();
{ // Block thread until async callback notifies us { // Block thread until async callback notifies us
//UNIQUE_LOCK(m,llk);
std::unique_lock<std::mutex> llk(m); 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 // Cancel any further results
lk.lock(); lk.lock();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment