diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2017-12-29 20:44:46 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2017-12-29 20:44:46 +0000 |
commit | e7d5dd7e56ad195038d7246a45d3ccb34f3cafe6 (patch) | |
tree | 84a3f93ec42896d54903cb61dee71abddf833633 | |
parent | Create a large thread pool when running core tests (diff) | |
download | netfs-e7d5dd7e56ad195038d7246a45d3ccb34f3cafe6.tar.bz2 netfs-e7d5dd7e56ad195038d7246a45d3ccb34f3cafe6.tar.xz netfs-e7d5dd7e56ad195038d7246a45d3ccb34f3cafe6.zip |
Have flush() wait on each BG operation in turn without holding _lock, BG operations themselves will remove themselves from the set upon completion
-rw-r--r-- | netfs/fuse/fuseFiles.cpp | 12 |
1 files changed, 6 insertions, 6 deletions
diff --git a/netfs/fuse/fuseFiles.cpp b/netfs/fuse/fuseFiles.cpp index eb80531..8aed188 100644 --- a/netfs/fuse/fuseFiles.cpp +++ b/netfs/fuse/fuseFiles.cpp @@ -30,12 +30,12 @@ FuseApp::OpenFile::wait() const void FuseApp::OpenFile::flush() { - Lock(_lock); - while (!bg.empty()) { - auto wi = bg.begin(); - auto w = wi->second; - bg.erase(w); - // bg operations are void, so no need to actually get the return value + auto first = [this]() { + SharedLock(_lock); + return bg.empty() ? nullptr : bg.begin()->second; + }; + while (auto w = first()) { + // background operations are void, so no need to actually get the return value w->throwLocalException(); } } |