summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2022-05-22 13:31:14 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2022-05-22 13:31:14 +0100
commit621ca5c09444edd9279e14245b9b9b6b387800ec (patch)
treee6db74cdad79b9ccf93c9f152e9d4dca8cbcddf6
parentwaitOnWriteRangeAndThen can have auto return type (diff)
downloadnetfs-621ca5c09444edd9279e14245b9b9b6b387800ec.tar.bz2
netfs-621ca5c09444edd9279e14245b9b9b6b387800ec.tar.xz
netfs-621ca5c09444edd9279e14245b9b9b6b387800ec.zip
Std algo write overlap testing
-rw-r--r--netfs/fuse/fuseFiles.cpp22
1 files 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<std::shared_ptr<OpenFile::WriteState>> 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<std::shared_future<void>> {},
+ [](auto && v, auto && i) {
+ v.push_back(i);
+ return std::forward<decltype(v)>(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;