diff options
author | Max Kellermann <max@duempel.org> | 2014-11-26 20:19:17 +0100 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2014-11-26 20:19:17 +0100 |
commit | 737a56a0302b1030e1071c7be9add7bdca955e32 (patch) | |
tree | 93d9b6d625fa1b0ce9e8bf8d13fbc829be5178d1 /src/lib/nfs/FileReader.cxx | |
parent | 12b6959ea201fea925c4376f961b8d54738292e2 (diff) | |
parent | 67cba251c8826409c82fb2ab75072dc4fca2b4dc (diff) | |
download | mpd-737a56a0302b1030e1071c7be9add7bdca955e32.tar.gz mpd-737a56a0302b1030e1071c7be9add7bdca955e32.tar.xz mpd-737a56a0302b1030e1071c7be9add7bdca955e32.zip |
Merge tag 'v0.19.5'
Diffstat (limited to 'src/lib/nfs/FileReader.cxx')
-rw-r--r-- | src/lib/nfs/FileReader.cxx | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/src/lib/nfs/FileReader.cxx b/src/lib/nfs/FileReader.cxx index 4837e1f0e..1b80f2c86 100644 --- a/src/lib/nfs/FileReader.cxx +++ b/src/lib/nfs/FileReader.cxx @@ -56,8 +56,18 @@ NfsFileReader::Close() return; } + /* this cancels State::MOUNT */ connection->RemoveLease(*this); + CancelOrClose(); +} + +void +NfsFileReader::CancelOrClose() +{ + assert(state != State::INITIAL && + state != State::DEFER); + if (state == State::IDLE) /* no async operation in progress: can close immediately */ @@ -164,6 +174,8 @@ NfsFileReader::OnNfsConnectionFailed(const Error &error) { assert(state == State::MOUNT); + state = State::INITIAL; + Error copy; copy.Set(error); OnNfsFileError(std::move(copy)); @@ -174,7 +186,7 @@ NfsFileReader::OnNfsConnectionDisconnected(const Error &error) { assert(state > State::MOUNT); - state = State::INITIAL; + CancelOrClose(); Error copy; copy.Set(error); @@ -246,6 +258,30 @@ NfsFileReader::OnNfsCallback(unsigned status, void *data) void NfsFileReader::OnNfsError(Error &&error) { + switch (state) { + case State::INITIAL: + case State::DEFER: + case State::MOUNT: + case State::IDLE: + assert(false); + gcc_unreachable(); + + case State::OPEN: + connection->RemoveLease(*this); + state = State::INITIAL; + break; + + case State::STAT: + connection->RemoveLease(*this); + connection->Close(fh); + state = State::INITIAL; + break; + + case State::READ: + state = State::IDLE; + break; + } + OnNfsFileError(std::move(error)); } |