lib/nfs/Connection: merge CancelAndClose() into Cancel()

This commit is contained in:
Max Kellermann 2024-05-17 12:33:12 +02:00
parent 96b61755da
commit 1d35031024
3 changed files with 21 additions and 31 deletions

View File

@ -112,7 +112,6 @@ NfsConnection::CancellableCallback::CancelAndScheduleClose(struct nfsfh *fh,
assert(!open);
assert(close_fh == nullptr);
assert(!dispose_value);
assert(fh != nullptr);
close_fh = fh;
dispose_value = std::move(_dispose_value);
@ -371,9 +370,12 @@ NfsConnection::Read(struct nfsfh *fh, uint64_t offset,
}
void
NfsConnection::Cancel(NfsCallback &callback) noexcept
NfsConnection::Cancel(NfsCallback &callback,
struct nfsfh *fh,
DisposablePointer dispose_value) noexcept
{
callbacks.Cancel(callback);
CancellableCallback &cancel = callbacks.Get(callback);
cancel.CancelAndScheduleClose(fh, std::move(dispose_value));
}
static void
@ -399,14 +401,6 @@ NfsConnection::Close(struct nfsfh *fh) noexcept
ScheduleSocket();
}
void
NfsConnection::CancelAndClose(struct nfsfh *fh, DisposablePointer dispose_value,
NfsCallback &callback) noexcept
{
CancellableCallback &cancel = callbacks.Get(callback);
cancel.CancelAndScheduleClose(fh, std::move(dispose_value));
}
void
NfsConnection::PrepareDestroyContext() noexcept
{

View File

@ -232,8 +232,14 @@ public:
* #NfsCallback.
*
* Not thread-safe.
*
* @param fh if not nullptr, then close this NFS file handle
* after cancellation completes
* @param dispose_value an arbitrary value that will be
* disposed of after cancellation completes
*/
void Cancel(NfsCallback &callback) noexcept;
void Cancel(NfsCallback &callback,
struct nfsfh *fh, DisposablePointer dispose_value) noexcept;
/**
* Close the specified file handle asynchronously.
@ -242,16 +248,6 @@ public:
*/
void Close(struct nfsfh *fh) noexcept;
/**
* Like Cancel(), but also close the specified NFS file
* handle.
*
* @param dispose_value an arbitrary value that will be
* disposed of after cancellation completes
*/
void CancelAndClose(struct nfsfh *fh, DisposablePointer dispose_value,
NfsCallback &callback) noexcept;
protected:
virtual void OnNfsConnectionError(std::exception_ptr e) noexcept = 0;

View File

@ -56,20 +56,20 @@ NfsFileReader::CancelOrClose() noexcept
/* no async operation in progress: can close
immediately */
connection->Close(fh);
else if (state > State::OPEN)
else if (state > State::OPEN) {
/* one async operation in progress: cancel it and
defer the nfs_close_async() call */
connection->CancelAndClose(fh,
DisposablePointer dispose_value{};
#ifdef LIBNFS_API_2
ToDeleteArray(read_buffer.release()),
#else
{},
dispose_value = ToDeleteArray(read_buffer.release());
#endif
*this);
else if (state > State::MOUNT)
connection->Cancel(*this, fh, std::move(dispose_value));
} else if (state > State::MOUNT)
/* we don't have a file handle yet - just cancel the
async operation */
connection->Cancel(*this);
connection->Cancel(*this, nullptr, {});
state = State::INITIAL;
}
@ -138,7 +138,7 @@ void
NfsFileReader::CancelRead() noexcept
{
if (state == State::READ) {
connection->Cancel(*this);
connection->Cancel(*this, nullptr, {});
state = State::IDLE;
}
}