lib/nfs: add "noexcept"
This commit is contained in:
parent
9d47b220a4
commit
a92e0e8540
@ -72,9 +72,9 @@ protected:
|
||||
|
||||
private:
|
||||
/* virtual methods from NfsFileReader */
|
||||
void OnNfsFileOpen(uint64_t size) override;
|
||||
void OnNfsFileRead(const void *data, size_t size) override;
|
||||
void OnNfsFileError(std::exception_ptr &&e) override;
|
||||
void OnNfsFileOpen(uint64_t size) noexcept override;
|
||||
void OnNfsFileRead(const void *data, size_t size) noexcept override;
|
||||
void OnNfsFileError(std::exception_ptr &&e) noexcept override;
|
||||
};
|
||||
|
||||
void
|
||||
@ -141,7 +141,7 @@ NfsInputStream::DoSeek(offset_type new_offset)
|
||||
}
|
||||
|
||||
void
|
||||
NfsInputStream::OnNfsFileOpen(uint64_t _size)
|
||||
NfsInputStream::OnNfsFileOpen(uint64_t _size) noexcept
|
||||
{
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
|
||||
@ -161,7 +161,7 @@ NfsInputStream::OnNfsFileOpen(uint64_t _size)
|
||||
}
|
||||
|
||||
void
|
||||
NfsInputStream::OnNfsFileRead(const void *data, size_t data_size)
|
||||
NfsInputStream::OnNfsFileRead(const void *data, size_t data_size) noexcept
|
||||
{
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
assert(!IsBufferFull());
|
||||
@ -174,7 +174,7 @@ NfsInputStream::OnNfsFileRead(const void *data, size_t data_size)
|
||||
}
|
||||
|
||||
void
|
||||
NfsInputStream::OnNfsFileError(std::exception_ptr &&e)
|
||||
NfsInputStream::OnNfsFileError(std::exception_ptr &&e) noexcept
|
||||
{
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
|
||||
@ -211,7 +211,7 @@ input_nfs_init(EventLoop &event_loop, const ConfigBlock &)
|
||||
}
|
||||
|
||||
static void
|
||||
input_nfs_finish()
|
||||
input_nfs_finish() noexcept
|
||||
{
|
||||
nfs_finish();
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ static char nfs_base_export_name[256];
|
||||
static size_t nfs_base_export_name_length;
|
||||
|
||||
void
|
||||
nfs_set_base(const char *server, const char *export_name)
|
||||
nfs_set_base(const char *server, const char *export_name) noexcept
|
||||
{
|
||||
assert(server != nullptr);
|
||||
assert(export_name != nullptr);
|
||||
|
@ -31,7 +31,7 @@
|
||||
* This is a kludge that is not truly thread-safe.
|
||||
*/
|
||||
void
|
||||
nfs_set_base(const char *server, const char *export_name);
|
||||
nfs_set_base(const char *server, const char *export_name) noexcept;
|
||||
|
||||
/**
|
||||
* Check if the given server and path are inside the "base"
|
||||
|
@ -42,7 +42,7 @@ BlockingNfsOperation::Run()
|
||||
}
|
||||
|
||||
void
|
||||
BlockingNfsOperation::OnNfsConnectionReady()
|
||||
BlockingNfsOperation::OnNfsConnectionReady() noexcept
|
||||
{
|
||||
try {
|
||||
Start();
|
||||
@ -54,21 +54,21 @@ BlockingNfsOperation::OnNfsConnectionReady()
|
||||
}
|
||||
|
||||
void
|
||||
BlockingNfsOperation::OnNfsConnectionFailed(std::exception_ptr e)
|
||||
BlockingNfsOperation::OnNfsConnectionFailed(std::exception_ptr e) noexcept
|
||||
{
|
||||
error = std::move(e);
|
||||
LockSetFinished();
|
||||
}
|
||||
|
||||
void
|
||||
BlockingNfsOperation::OnNfsConnectionDisconnected(std::exception_ptr e)
|
||||
BlockingNfsOperation::OnNfsConnectionDisconnected(std::exception_ptr e) noexcept
|
||||
{
|
||||
error = std::move(e);
|
||||
LockSetFinished();
|
||||
}
|
||||
|
||||
void
|
||||
BlockingNfsOperation::OnNfsCallback(unsigned status, void *data)
|
||||
BlockingNfsOperation::OnNfsCallback(unsigned status, void *data) noexcept
|
||||
{
|
||||
connection.RemoveLease(*this);
|
||||
|
||||
@ -77,7 +77,7 @@ BlockingNfsOperation::OnNfsCallback(unsigned status, void *data)
|
||||
}
|
||||
|
||||
void
|
||||
BlockingNfsOperation::OnNfsError(std::exception_ptr &&e)
|
||||
BlockingNfsOperation::OnNfsError(std::exception_ptr &&e) noexcept
|
||||
{
|
||||
connection.RemoveLease(*this);
|
||||
|
||||
|
@ -50,7 +50,7 @@ protected:
|
||||
NfsConnection &connection;
|
||||
|
||||
public:
|
||||
BlockingNfsOperation(NfsConnection &_connection)
|
||||
BlockingNfsOperation(NfsConnection &_connection) noexcept
|
||||
:finished(false), connection(_connection) {}
|
||||
|
||||
/**
|
||||
@ -59,7 +59,7 @@ public:
|
||||
void Run();
|
||||
|
||||
private:
|
||||
bool LockWaitFinished() {
|
||||
bool LockWaitFinished() noexcept {
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
while (!finished)
|
||||
if (!cond.timed_wait(mutex, timeout))
|
||||
@ -72,24 +72,24 @@ private:
|
||||
* Mark the operation as "finished" and wake up the waiting
|
||||
* thread.
|
||||
*/
|
||||
void LockSetFinished() {
|
||||
void LockSetFinished() noexcept {
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
finished = true;
|
||||
cond.signal();
|
||||
}
|
||||
|
||||
/* virtual methods from NfsLease */
|
||||
void OnNfsConnectionReady() final;
|
||||
void OnNfsConnectionFailed(std::exception_ptr e) final;
|
||||
void OnNfsConnectionDisconnected(std::exception_ptr e) final;
|
||||
void OnNfsConnectionReady() noexcept final;
|
||||
void OnNfsConnectionFailed(std::exception_ptr e) noexcept final;
|
||||
void OnNfsConnectionDisconnected(std::exception_ptr e) noexcept final;
|
||||
|
||||
/* virtual methods from NfsCallback */
|
||||
void OnNfsCallback(unsigned status, void *data) final;
|
||||
void OnNfsError(std::exception_ptr &&e) final;
|
||||
void OnNfsCallback(unsigned status, void *data) noexcept final;
|
||||
void OnNfsError(std::exception_ptr &&e) noexcept final;
|
||||
|
||||
protected:
|
||||
virtual void Start() = 0;
|
||||
virtual void HandleResult(unsigned status, void *data) = 0;
|
||||
virtual void HandleResult(unsigned status, void *data) noexcept = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -34,12 +34,12 @@ public:
|
||||
/**
|
||||
* The operation completed successfully.
|
||||
*/
|
||||
virtual void OnNfsCallback(unsigned status, void *data) = 0;
|
||||
virtual void OnNfsCallback(unsigned status, void *data) noexcept = 0;
|
||||
|
||||
/**
|
||||
* An error has occurred.
|
||||
*/
|
||||
virtual void OnNfsError(std::exception_ptr &&e) = 0;
|
||||
virtual void OnNfsError(std::exception_ptr &&e) noexcept = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -98,7 +98,7 @@ NfsConnection::CancellableCallback::Read(nfs_context *ctx, struct nfsfh *fh,
|
||||
}
|
||||
|
||||
inline void
|
||||
NfsConnection::CancellableCallback::CancelAndScheduleClose(struct nfsfh *fh)
|
||||
NfsConnection::CancellableCallback::CancelAndScheduleClose(struct nfsfh *fh) noexcept
|
||||
{
|
||||
assert(connection.GetEventLoop().IsInside());
|
||||
assert(!open);
|
||||
@ -110,7 +110,7 @@ NfsConnection::CancellableCallback::CancelAndScheduleClose(struct nfsfh *fh)
|
||||
}
|
||||
|
||||
inline void
|
||||
NfsConnection::CancellableCallback::PrepareDestroyContext()
|
||||
NfsConnection::CancellableCallback::PrepareDestroyContext() noexcept
|
||||
{
|
||||
assert(IsCancelled());
|
||||
|
||||
@ -121,7 +121,7 @@ NfsConnection::CancellableCallback::PrepareDestroyContext()
|
||||
}
|
||||
|
||||
inline void
|
||||
NfsConnection::CancellableCallback::Callback(int err, void *data)
|
||||
NfsConnection::CancellableCallback::Callback(int err, void *data) noexcept
|
||||
{
|
||||
assert(connection.GetEventLoop().IsInside());
|
||||
|
||||
@ -157,27 +157,28 @@ NfsConnection::CancellableCallback::Callback(int err, void *data)
|
||||
void
|
||||
NfsConnection::CancellableCallback::Callback(int err,
|
||||
gcc_unused struct nfs_context *nfs,
|
||||
void *data, void *private_data)
|
||||
void *data,
|
||||
void *private_data) noexcept
|
||||
{
|
||||
CancellableCallback &c = *(CancellableCallback *)private_data;
|
||||
c.Callback(err, data);
|
||||
}
|
||||
|
||||
static constexpr unsigned
|
||||
libnfs_to_events(int i)
|
||||
libnfs_to_events(int i) noexcept
|
||||
{
|
||||
return ((i & POLLIN) ? SocketMonitor::READ : 0) |
|
||||
((i & POLLOUT) ? SocketMonitor::WRITE : 0);
|
||||
}
|
||||
|
||||
static constexpr int
|
||||
events_to_libnfs(unsigned i)
|
||||
events_to_libnfs(unsigned i) noexcept
|
||||
{
|
||||
return ((i & SocketMonitor::READ) ? POLLIN : 0) |
|
||||
((i & SocketMonitor::WRITE) ? POLLOUT : 0);
|
||||
}
|
||||
|
||||
NfsConnection::~NfsConnection()
|
||||
NfsConnection::~NfsConnection() noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
assert(new_leases.empty());
|
||||
@ -190,7 +191,7 @@ NfsConnection::~NfsConnection()
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::AddLease(NfsLease &lease)
|
||||
NfsConnection::AddLease(NfsLease &lease) noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
@ -200,7 +201,7 @@ NfsConnection::AddLease(NfsLease &lease)
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::RemoveLease(NfsLease &lease)
|
||||
NfsConnection::RemoveLease(NfsLease &lease) noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
@ -243,7 +244,7 @@ NfsConnection::OpenDirectory(const char *path, NfsCallback &callback)
|
||||
}
|
||||
|
||||
const struct nfsdirent *
|
||||
NfsConnection::ReadDirectory(struct nfsdir *dir)
|
||||
NfsConnection::ReadDirectory(struct nfsdir *dir) noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
@ -251,7 +252,7 @@ NfsConnection::ReadDirectory(struct nfsdir *dir)
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::CloseDirectory(struct nfsdir *dir)
|
||||
NfsConnection::CloseDirectory(struct nfsdir *dir) noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
@ -311,18 +312,18 @@ NfsConnection::Read(struct nfsfh *fh, uint64_t offset, size_t size,
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::Cancel(NfsCallback &callback)
|
||||
NfsConnection::Cancel(NfsCallback &callback) noexcept
|
||||
{
|
||||
callbacks.Cancel(callback);
|
||||
}
|
||||
|
||||
static void
|
||||
DummyCallback(int, struct nfs_context *, void *, void *)
|
||||
DummyCallback(int, struct nfs_context *, void *, void *) noexcept
|
||||
{
|
||||
}
|
||||
|
||||
inline void
|
||||
NfsConnection::InternalClose(struct nfsfh *fh)
|
||||
NfsConnection::InternalClose(struct nfsfh *fh) noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
assert(context != nullptr);
|
||||
@ -332,7 +333,7 @@ NfsConnection::InternalClose(struct nfsfh *fh)
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::Close(struct nfsfh *fh)
|
||||
NfsConnection::Close(struct nfsfh *fh) noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
@ -341,14 +342,14 @@ NfsConnection::Close(struct nfsfh *fh)
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::CancelAndClose(struct nfsfh *fh, NfsCallback &callback)
|
||||
NfsConnection::CancelAndClose(struct nfsfh *fh, NfsCallback &callback) noexcept
|
||||
{
|
||||
CancellableCallback &cancel = callbacks.Get(callback);
|
||||
cancel.CancelAndScheduleClose(fh);
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::DestroyContext()
|
||||
NfsConnection::DestroyContext() noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
assert(context != nullptr);
|
||||
@ -379,7 +380,7 @@ NfsConnection::DestroyContext()
|
||||
}
|
||||
|
||||
inline void
|
||||
NfsConnection::DeferClose(struct nfsfh *fh)
|
||||
NfsConnection::DeferClose(struct nfsfh *fh) noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
assert(in_event);
|
||||
@ -391,7 +392,7 @@ NfsConnection::DeferClose(struct nfsfh *fh)
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::ScheduleSocket()
|
||||
NfsConnection::ScheduleSocket() noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
assert(context != nullptr);
|
||||
@ -421,7 +422,7 @@ NfsConnection::ScheduleSocket()
|
||||
}
|
||||
|
||||
inline int
|
||||
NfsConnection::Service(unsigned flags)
|
||||
NfsConnection::Service(unsigned flags) noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
assert(context != nullptr);
|
||||
@ -518,7 +519,7 @@ NfsConnection::OnSocketReady(unsigned flags) noexcept
|
||||
|
||||
inline void
|
||||
NfsConnection::MountCallback(int status, gcc_unused nfs_context *nfs,
|
||||
gcc_unused void *data)
|
||||
gcc_unused void *data) noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
assert(context == nfs);
|
||||
@ -538,7 +539,7 @@ NfsConnection::MountCallback(int status, gcc_unused nfs_context *nfs,
|
||||
|
||||
void
|
||||
NfsConnection::MountCallback(int status, nfs_context *nfs, void *data,
|
||||
void *private_data)
|
||||
void *private_data) noexcept
|
||||
{
|
||||
NfsConnection *c = (NfsConnection *)private_data;
|
||||
|
||||
@ -579,7 +580,7 @@ NfsConnection::MountInternal()
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::BroadcastMountSuccess()
|
||||
NfsConnection::BroadcastMountSuccess() noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
@ -591,7 +592,7 @@ NfsConnection::BroadcastMountSuccess()
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::BroadcastMountError(std::exception_ptr &&e)
|
||||
NfsConnection::BroadcastMountError(std::exception_ptr &&e) noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
@ -605,7 +606,7 @@ NfsConnection::BroadcastMountError(std::exception_ptr &&e)
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::BroadcastError(std::exception_ptr &&e)
|
||||
NfsConnection::BroadcastError(std::exception_ptr &&e) noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
@ -619,7 +620,7 @@ NfsConnection::BroadcastError(std::exception_ptr &&e)
|
||||
}
|
||||
|
||||
void
|
||||
NfsConnection::OnMountTimeout()
|
||||
NfsConnection::OnMountTimeout() noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
assert(!mount_finished);
|
||||
|
@ -60,7 +60,7 @@ class NfsConnection : SocketMonitor {
|
||||
public:
|
||||
explicit CancellableCallback(NfsCallback &_callback,
|
||||
NfsConnection &_connection,
|
||||
bool _open)
|
||||
bool _open) noexcept
|
||||
:CancellablePointer<NfsCallback>(_callback),
|
||||
connection(_connection),
|
||||
open(_open), close_fh(nullptr) {}
|
||||
@ -76,19 +76,19 @@ class NfsConnection : SocketMonitor {
|
||||
* Cancel the operation and schedule a call to
|
||||
* nfs_close_async() with the given file handle.
|
||||
*/
|
||||
void CancelAndScheduleClose(struct nfsfh *fh);
|
||||
void CancelAndScheduleClose(struct nfsfh *fh) noexcept;
|
||||
|
||||
/**
|
||||
* Called by NfsConnection::DestroyContext() right
|
||||
* before nfs_destroy_context(). This object is given
|
||||
* a chance to prepare for the latter.
|
||||
*/
|
||||
void PrepareDestroyContext();
|
||||
void PrepareDestroyContext() noexcept;
|
||||
|
||||
private:
|
||||
static void Callback(int err, struct nfs_context *nfs,
|
||||
void *data, void *private_data);
|
||||
void Callback(int err, void *data);
|
||||
void *data, void *private_data) noexcept;
|
||||
void Callback(int err, void *data) noexcept;
|
||||
};
|
||||
|
||||
DeferEvent defer_new_lease;
|
||||
@ -148,7 +148,7 @@ public:
|
||||
/**
|
||||
* Must be run from EventLoop's thread.
|
||||
*/
|
||||
~NfsConnection();
|
||||
~NfsConnection() noexcept;
|
||||
|
||||
gcc_pure
|
||||
const char *GetServer() const noexcept {
|
||||
@ -171,14 +171,14 @@ public:
|
||||
* This method is thread-safe. However, #NfsLease's methods
|
||||
* will be invoked from within the #EventLoop's thread.
|
||||
*/
|
||||
void AddLease(NfsLease &lease);
|
||||
void RemoveLease(NfsLease &lease);
|
||||
void AddLease(NfsLease &lease) noexcept;
|
||||
void RemoveLease(NfsLease &lease) noexcept;
|
||||
|
||||
void Stat(const char *path, NfsCallback &callback);
|
||||
|
||||
void OpenDirectory(const char *path, NfsCallback &callback);
|
||||
const struct nfsdirent *ReadDirectory(struct nfsdir *dir);
|
||||
void CloseDirectory(struct nfsdir *dir);
|
||||
const struct nfsdirent *ReadDirectory(struct nfsdir *dir) noexcept;
|
||||
void CloseDirectory(struct nfsdir *dir) noexcept;
|
||||
|
||||
/**
|
||||
* Throws std::runtime_error on error.
|
||||
@ -193,48 +193,48 @@ public:
|
||||
void Read(struct nfsfh *fh, uint64_t offset, size_t size,
|
||||
NfsCallback &callback);
|
||||
|
||||
void Cancel(NfsCallback &callback);
|
||||
void Cancel(NfsCallback &callback) noexcept;
|
||||
|
||||
void Close(struct nfsfh *fh);
|
||||
void CancelAndClose(struct nfsfh *fh, NfsCallback &callback);
|
||||
void Close(struct nfsfh *fh) noexcept;
|
||||
void CancelAndClose(struct nfsfh *fh, NfsCallback &callback) noexcept;
|
||||
|
||||
protected:
|
||||
virtual void OnNfsConnectionError(std::exception_ptr &&e) = 0;
|
||||
virtual void OnNfsConnectionError(std::exception_ptr &&e) noexcept = 0;
|
||||
|
||||
private:
|
||||
void DestroyContext();
|
||||
void DestroyContext() noexcept;
|
||||
|
||||
/**
|
||||
* Wrapper for nfs_close_async().
|
||||
*/
|
||||
void InternalClose(struct nfsfh *fh);
|
||||
void InternalClose(struct nfsfh *fh) noexcept;
|
||||
|
||||
/**
|
||||
* Invoke nfs_close_async() after nfs_service() returns.
|
||||
*/
|
||||
void DeferClose(struct nfsfh *fh);
|
||||
void DeferClose(struct nfsfh *fh) noexcept;
|
||||
|
||||
void MountInternal();
|
||||
void BroadcastMountSuccess();
|
||||
void BroadcastMountError(std::exception_ptr &&e);
|
||||
void BroadcastError(std::exception_ptr &&e);
|
||||
void BroadcastMountSuccess() noexcept;
|
||||
void BroadcastMountError(std::exception_ptr &&e) noexcept;
|
||||
void BroadcastError(std::exception_ptr &&e) noexcept;
|
||||
|
||||
static void MountCallback(int status, nfs_context *nfs, void *data,
|
||||
void *private_data);
|
||||
void MountCallback(int status, nfs_context *nfs, void *data);
|
||||
void *private_data) noexcept;
|
||||
void MountCallback(int status, nfs_context *nfs, void *data) noexcept;
|
||||
|
||||
void ScheduleSocket();
|
||||
void ScheduleSocket() noexcept;
|
||||
|
||||
/**
|
||||
* Wrapper for nfs_service().
|
||||
*/
|
||||
int Service(unsigned flags);
|
||||
int Service(unsigned flags) noexcept;
|
||||
|
||||
/* virtual methods from SocketMonitor */
|
||||
bool OnSocketReady(unsigned flags) noexcept override;
|
||||
|
||||
/* callback for #mount_timeout_event */
|
||||
void OnMountTimeout();
|
||||
void OnMountTimeout() noexcept;
|
||||
|
||||
/* DeferEvent callback */
|
||||
void RunDeferred() noexcept;
|
||||
|
@ -32,18 +32,18 @@
|
||||
#include <fcntl.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
NfsFileReader::NfsFileReader()
|
||||
NfsFileReader::NfsFileReader() noexcept
|
||||
:defer_open(nfs_get_event_loop(), BIND_THIS_METHOD(OnDeferredOpen))
|
||||
{
|
||||
}
|
||||
|
||||
NfsFileReader::~NfsFileReader()
|
||||
NfsFileReader::~NfsFileReader() noexcept
|
||||
{
|
||||
assert(state == State::INITIAL);
|
||||
}
|
||||
|
||||
void
|
||||
NfsFileReader::Close()
|
||||
NfsFileReader::Close() noexcept
|
||||
{
|
||||
if (state == State::INITIAL)
|
||||
return;
|
||||
@ -61,7 +61,7 @@ NfsFileReader::Close()
|
||||
}
|
||||
|
||||
void
|
||||
NfsFileReader::CancelOrClose()
|
||||
NfsFileReader::CancelOrClose() noexcept
|
||||
{
|
||||
assert(state != State::INITIAL &&
|
||||
state != State::DEFER);
|
||||
@ -83,7 +83,7 @@ NfsFileReader::CancelOrClose()
|
||||
}
|
||||
|
||||
void
|
||||
NfsFileReader::DeferClose()
|
||||
NfsFileReader::DeferClose() noexcept
|
||||
{
|
||||
BlockingCall(GetEventLoop(), [this](){ Close(); });
|
||||
}
|
||||
@ -135,7 +135,7 @@ NfsFileReader::Read(uint64_t offset, size_t size)
|
||||
}
|
||||
|
||||
void
|
||||
NfsFileReader::CancelRead()
|
||||
NfsFileReader::CancelRead() noexcept
|
||||
{
|
||||
if (state == State::READ) {
|
||||
connection->Cancel(*this);
|
||||
@ -144,7 +144,7 @@ NfsFileReader::CancelRead()
|
||||
}
|
||||
|
||||
void
|
||||
NfsFileReader::OnNfsConnectionReady()
|
||||
NfsFileReader::OnNfsConnectionReady() noexcept
|
||||
{
|
||||
assert(state == State::MOUNT);
|
||||
|
||||
@ -159,7 +159,7 @@ NfsFileReader::OnNfsConnectionReady()
|
||||
}
|
||||
|
||||
void
|
||||
NfsFileReader::OnNfsConnectionFailed(std::exception_ptr e)
|
||||
NfsFileReader::OnNfsConnectionFailed(std::exception_ptr e) noexcept
|
||||
{
|
||||
assert(state == State::MOUNT);
|
||||
|
||||
@ -169,7 +169,7 @@ NfsFileReader::OnNfsConnectionFailed(std::exception_ptr e)
|
||||
}
|
||||
|
||||
void
|
||||
NfsFileReader::OnNfsConnectionDisconnected(std::exception_ptr e)
|
||||
NfsFileReader::OnNfsConnectionDisconnected(std::exception_ptr e) noexcept
|
||||
{
|
||||
assert(state > State::MOUNT);
|
||||
|
||||
@ -179,7 +179,7 @@ NfsFileReader::OnNfsConnectionDisconnected(std::exception_ptr e)
|
||||
}
|
||||
|
||||
inline void
|
||||
NfsFileReader::OpenCallback(nfsfh *_fh)
|
||||
NfsFileReader::OpenCallback(nfsfh *_fh) noexcept
|
||||
{
|
||||
assert(state == State::OPEN);
|
||||
assert(connection != nullptr);
|
||||
@ -198,7 +198,7 @@ NfsFileReader::OpenCallback(nfsfh *_fh)
|
||||
}
|
||||
|
||||
inline void
|
||||
NfsFileReader::StatCallback(const struct stat *st)
|
||||
NfsFileReader::StatCallback(const struct stat *st) noexcept
|
||||
{
|
||||
assert(state == State::STAT);
|
||||
assert(connection != nullptr);
|
||||
@ -216,7 +216,7 @@ NfsFileReader::StatCallback(const struct stat *st)
|
||||
}
|
||||
|
||||
void
|
||||
NfsFileReader::OnNfsCallback(unsigned status, void *data)
|
||||
NfsFileReader::OnNfsCallback(unsigned status, void *data) noexcept
|
||||
{
|
||||
switch (state) {
|
||||
case State::INITIAL:
|
||||
@ -242,7 +242,7 @@ NfsFileReader::OnNfsCallback(unsigned status, void *data)
|
||||
}
|
||||
|
||||
void
|
||||
NfsFileReader::OnNfsError(std::exception_ptr &&e)
|
||||
NfsFileReader::OnNfsError(std::exception_ptr &&e) noexcept
|
||||
{
|
||||
switch (state) {
|
||||
case State::INITIAL:
|
||||
|
@ -66,15 +66,15 @@ class NfsFileReader : NfsLease, NfsCallback {
|
||||
DeferEvent defer_open;
|
||||
|
||||
public:
|
||||
NfsFileReader();
|
||||
~NfsFileReader();
|
||||
NfsFileReader() noexcept;
|
||||
~NfsFileReader() noexcept;
|
||||
|
||||
EventLoop &GetEventLoop() noexcept {
|
||||
return defer_open.GetEventLoop();
|
||||
}
|
||||
|
||||
void Close();
|
||||
void DeferClose();
|
||||
void Close() noexcept;
|
||||
void DeferClose() noexcept;
|
||||
|
||||
/**
|
||||
* Open the file. This method is thread-safe.
|
||||
@ -101,9 +101,9 @@ public:
|
||||
* This method is not thread-safe and must be called from
|
||||
* within the I/O thread.
|
||||
*/
|
||||
void CancelRead();
|
||||
void CancelRead() noexcept;
|
||||
|
||||
bool IsIdle() const {
|
||||
bool IsIdle() const noexcept {
|
||||
return state == State::IDLE;
|
||||
}
|
||||
|
||||
@ -115,40 +115,40 @@ protected:
|
||||
*
|
||||
* This method will be called from within the I/O thread.
|
||||
*/
|
||||
virtual void OnNfsFileOpen(uint64_t size) = 0;
|
||||
virtual void OnNfsFileOpen(uint64_t size) noexcept = 0;
|
||||
|
||||
/**
|
||||
* A Read() has completed successfully.
|
||||
*
|
||||
* This method will be called from within the I/O thread.
|
||||
*/
|
||||
virtual void OnNfsFileRead(const void *data, size_t size) = 0;
|
||||
virtual void OnNfsFileRead(const void *data, size_t size) noexcept = 0;
|
||||
|
||||
/**
|
||||
* An error has occurred, which can be either while waiting
|
||||
* for OnNfsFileOpen(), or while waiting for OnNfsFileRead(),
|
||||
* or if disconnected while idle.
|
||||
*/
|
||||
virtual void OnNfsFileError(std::exception_ptr &&e) = 0;
|
||||
virtual void OnNfsFileError(std::exception_ptr &&e) noexcept = 0;
|
||||
|
||||
private:
|
||||
/**
|
||||
* Cancel the current operation, if any. The NfsLease must be
|
||||
* unregistered already.
|
||||
*/
|
||||
void CancelOrClose();
|
||||
void CancelOrClose() noexcept;
|
||||
|
||||
void OpenCallback(nfsfh *_fh);
|
||||
void StatCallback(const struct stat *st);
|
||||
void OpenCallback(nfsfh *_fh) noexcept;
|
||||
void StatCallback(const struct stat *st) noexcept;
|
||||
|
||||
/* virtual methods from NfsLease */
|
||||
void OnNfsConnectionReady() final;
|
||||
void OnNfsConnectionFailed(std::exception_ptr e) final;
|
||||
void OnNfsConnectionDisconnected(std::exception_ptr e) final;
|
||||
void OnNfsConnectionReady() noexcept final;
|
||||
void OnNfsConnectionFailed(std::exception_ptr e) noexcept final;
|
||||
void OnNfsConnectionDisconnected(std::exception_ptr e) noexcept final;
|
||||
|
||||
/* virtual methods from NfsCallback */
|
||||
void OnNfsCallback(unsigned status, void *data) final;
|
||||
void OnNfsError(std::exception_ptr &&e) final;
|
||||
void OnNfsCallback(unsigned status, void *data) noexcept final;
|
||||
void OnNfsError(std::exception_ptr &&e) noexcept final;
|
||||
|
||||
/* DeferEvent callback */
|
||||
void OnDeferredOpen() noexcept;
|
||||
|
@ -30,19 +30,19 @@ public:
|
||||
* The #NfsConnection has successfully mounted the server's
|
||||
* export and is ready for regular operation.
|
||||
*/
|
||||
virtual void OnNfsConnectionReady() = 0;
|
||||
virtual void OnNfsConnectionReady() noexcept = 0;
|
||||
|
||||
/**
|
||||
* The #NfsConnection has failed to mount the server's export.
|
||||
* This is being called instead of OnNfsConnectionReady().
|
||||
*/
|
||||
virtual void OnNfsConnectionFailed(std::exception_ptr e) = 0;
|
||||
virtual void OnNfsConnectionFailed(std::exception_ptr e) noexcept = 0;
|
||||
|
||||
/**
|
||||
* The #NfsConnection has failed after OnNfsConnectionReady()
|
||||
* had been called already.
|
||||
*/
|
||||
virtual void OnNfsConnectionDisconnected(std::exception_ptr e) = 0;
|
||||
virtual void OnNfsConnectionDisconnected(std::exception_ptr e) noexcept = 0;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
@ -26,7 +26,7 @@
|
||||
#include <string.h>
|
||||
|
||||
void
|
||||
NfsManager::ManagedConnection::OnNfsConnectionError(std::exception_ptr &&e)
|
||||
NfsManager::ManagedConnection::OnNfsConnectionError(std::exception_ptr &&e) noexcept
|
||||
{
|
||||
FormatError(e, "NFS error on %s:%s", GetServer(), GetExportName());
|
||||
|
||||
@ -72,7 +72,7 @@ NfsManager::Compare::operator()(const ManagedConnection &a,
|
||||
return result < 0;
|
||||
}
|
||||
|
||||
NfsManager::~NfsManager()
|
||||
NfsManager::~NfsManager() noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
@ -102,7 +102,7 @@ NfsManager::GetConnection(const char *server, const char *export_name) noexcept
|
||||
}
|
||||
|
||||
void
|
||||
NfsManager::CollectGarbage()
|
||||
NfsManager::CollectGarbage() noexcept
|
||||
{
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
|
@ -47,13 +47,13 @@ class NfsManager final : IdleMonitor {
|
||||
public:
|
||||
ManagedConnection(NfsManager &_manager, EventLoop &_loop,
|
||||
const char *_server,
|
||||
const char *_export_name)
|
||||
const char *_export_name) noexcept
|
||||
:NfsConnection(_loop, _server, _export_name),
|
||||
manager(_manager) {}
|
||||
|
||||
protected:
|
||||
/* virtual methods from NfsConnection */
|
||||
void OnNfsConnectionError(std::exception_ptr &&e) override;
|
||||
void OnNfsConnectionError(std::exception_ptr &&e) noexcept override;
|
||||
};
|
||||
|
||||
struct Compare {
|
||||
@ -89,13 +89,13 @@ class NfsManager final : IdleMonitor {
|
||||
List garbage;
|
||||
|
||||
public:
|
||||
NfsManager(EventLoop &_loop)
|
||||
explicit NfsManager(EventLoop &_loop) noexcept
|
||||
:IdleMonitor(_loop) {}
|
||||
|
||||
/**
|
||||
* Must be run from EventLoop's thread.
|
||||
*/
|
||||
~NfsManager();
|
||||
~NfsManager() noexcept;
|
||||
|
||||
using IdleMonitor::GetEventLoop;
|
||||
|
||||
@ -104,7 +104,7 @@ public:
|
||||
const char *export_name) noexcept;
|
||||
|
||||
private:
|
||||
void ScheduleDelete(ManagedConnection &c) {
|
||||
void ScheduleDelete(ManagedConnection &c) noexcept {
|
||||
connections.erase(connections.iterator_to(c));
|
||||
garbage.push_front(c);
|
||||
IdleMonitor::Schedule();
|
||||
@ -113,7 +113,7 @@ private:
|
||||
/**
|
||||
* Delete all connections on the #garbage list.
|
||||
*/
|
||||
void CollectGarbage();
|
||||
void CollectGarbage() noexcept;
|
||||
|
||||
/* virtual methods from IdleMonitor */
|
||||
void OnIdle() noexcept override;
|
||||
|
@ -95,20 +95,20 @@ public:
|
||||
const char *MapToRelativeUTF8(const char *uri_utf8) const noexcept override;
|
||||
|
||||
/* virtual methods from NfsLease */
|
||||
void OnNfsConnectionReady() final {
|
||||
void OnNfsConnectionReady() noexcept final {
|
||||
assert(state == State::CONNECTING);
|
||||
|
||||
SetState(State::READY);
|
||||
}
|
||||
|
||||
void OnNfsConnectionFailed(std::exception_ptr e) final {
|
||||
void OnNfsConnectionFailed(std::exception_ptr e) noexcept final {
|
||||
assert(state == State::CONNECTING);
|
||||
|
||||
SetState(State::DELAY, std::move(e));
|
||||
reconnect_timer.Schedule(std::chrono::minutes(1));
|
||||
}
|
||||
|
||||
void OnNfsConnectionDisconnected(std::exception_ptr e) final {
|
||||
void OnNfsConnectionDisconnected(std::exception_ptr e) noexcept final {
|
||||
assert(state == State::READY);
|
||||
|
||||
SetState(State::DELAY, std::move(e));
|
||||
@ -129,11 +129,11 @@ public:
|
||||
}
|
||||
|
||||
private:
|
||||
EventLoop &GetEventLoop() {
|
||||
EventLoop &GetEventLoop() noexcept {
|
||||
return defer_connect.GetEventLoop();
|
||||
}
|
||||
|
||||
void SetState(State _state) {
|
||||
void SetState(State _state) noexcept {
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
@ -141,7 +141,7 @@ private:
|
||||
cond.broadcast();
|
||||
}
|
||||
|
||||
void SetState(State _state, std::exception_ptr &&e) {
|
||||
void SetState(State _state, std::exception_ptr &&e) noexcept {
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
const std::lock_guard<Mutex> protect(mutex);
|
||||
@ -150,7 +150,7 @@ private:
|
||||
cond.broadcast();
|
||||
}
|
||||
|
||||
void Connect() {
|
||||
void Connect() noexcept {
|
||||
assert(state != State::READY);
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
@ -161,7 +161,7 @@ private:
|
||||
SetState(State::CONNECTING);
|
||||
}
|
||||
|
||||
void EnsureConnected() {
|
||||
void EnsureConnected() noexcept {
|
||||
if (state != State::READY)
|
||||
Connect();
|
||||
}
|
||||
@ -191,7 +191,7 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
void Disconnect() {
|
||||
void Disconnect() noexcept {
|
||||
assert(GetEventLoop().IsInside());
|
||||
|
||||
switch (state) {
|
||||
@ -243,7 +243,7 @@ NfsStorage::MapToRelativeUTF8(const char *uri_utf8) const noexcept
|
||||
}
|
||||
|
||||
static void
|
||||
Copy(StorageFileInfo &info, const struct stat &st)
|
||||
Copy(StorageFileInfo &info, const struct stat &st) noexcept
|
||||
{
|
||||
if (S_ISREG(st.st_mode))
|
||||
info.type = StorageFileInfo::Type::REGULAR;
|
||||
@ -275,7 +275,7 @@ protected:
|
||||
connection.Stat(path, *this);
|
||||
}
|
||||
|
||||
void HandleResult(gcc_unused unsigned status, void *data) override {
|
||||
void HandleResult(gcc_unused unsigned status, void *data) noexcept override {
|
||||
Copy(info, *(const struct stat *)data);
|
||||
}
|
||||
};
|
||||
@ -343,7 +343,8 @@ protected:
|
||||
connection.OpenDirectory(path, *this);
|
||||
}
|
||||
|
||||
void HandleResult(gcc_unused unsigned status, void *data) override {
|
||||
void HandleResult(gcc_unused unsigned status,
|
||||
void *data) noexcept override {
|
||||
struct nfsdir *const dir = (struct nfsdir *)data;
|
||||
|
||||
CollectEntries(dir);
|
||||
|
Loading…
Reference in New Issue
Block a user