From 621ca5c09444edd9279e14245b9b9b6b387800ec Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 22 May 2022 13:31:14 +0100 Subject: Std algo write overlap testing --- netfs/fuse/fuseFiles.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/netfs/fuse/fuseFiles.cpp b/netfs/fuse/fuseFiles.cpp index eeb5423..7cc6413 100644 --- a/netfs/fuse/fuseFiles.cpp +++ b/netfs/fuse/fuseFiles.cpp @@ -123,23 +123,27 @@ namespace NetFS { while (true) { std::unique_lock lock(of->mutex); // Acquire operations to wait for - auto R = of->bg.equal_range(key); + const auto R = of->bg.equal_range(key); if (R.first == R.second) { // Perform operation return f(key); } else { - std::vector> overlap; - overlap.reserve(safe {std::distance(R.first, R.second)}); - for (auto i = R.first; i != R.second; i++) { - overlap.push_back(i->second); - } + const auto overlap = std::transform_reduce( + R.first, R.second, std::vector> {}, + [](auto && v, auto && i) { + v.push_back(i); + return std::forward(v); + }, + [](auto && i) { + return i.second->future; + }); // Wait for them whilst unlocked lock.release()->unlock(); try { - for (const auto & r : overlap) { - r->future.get(); - } + std::for_each(overlap.begin(), overlap.end(), [](auto && r) { + r.get(); + }); } catch (const SystemError &) { throw; -- cgit v1.2.3