lib/nfs: migrate from DeferredMonitor to DeferEvent

This commit is contained in:
Max Kellermann 2017-11-10 21:01:01 +01:00
parent 4c1d29c86c
commit 1ccd2a7b11
5 changed files with 33 additions and 27 deletions

View File

@ -196,7 +196,7 @@ NfsConnection::AddLease(NfsLease &lease)
new_leases.push_back(&lease);
DeferredMonitor::Schedule();
defer_new_lease.Schedule();
}
void
@ -363,9 +363,9 @@ NfsConnection::DestroyContext()
mount_timeout_event.Cancel();
}
/* cancel pending DeferredMonitor that was scheduled to notify
/* cancel pending DeferEvent that was scheduled to notify
new leases */
DeferredMonitor::Cancel();
defer_new_lease.Cancel();
if (SocketMonitor::IsDefined())
SocketMonitor::Steal();
@ -631,7 +631,7 @@ NfsConnection::OnMountTimeout()
}
void
NfsConnection::RunDeferred()
NfsConnection::RunDeferred() noexcept
{
assert(GetEventLoop().IsInside());

View File

@ -23,7 +23,7 @@
#include "Cancellable.hxx"
#include "event/SocketMonitor.hxx"
#include "event/TimerEvent.hxx"
#include "event/DeferredMonitor.hxx"
#include "event/DeferEvent.hxx"
#include <string>
#include <list>
@ -39,7 +39,7 @@ class NfsLease;
/**
* An asynchronous connection to a NFS server.
*/
class NfsConnection : SocketMonitor, DeferredMonitor {
class NfsConnection : SocketMonitor {
class CancellableCallback : public CancellablePointer<NfsCallback> {
NfsConnection &connection;
@ -91,6 +91,7 @@ class NfsConnection : SocketMonitor, DeferredMonitor {
void Callback(int err, void *data);
};
DeferEvent defer_new_lease;
TimerEvent mount_timeout_event;
std::string server, export_name;
@ -139,7 +140,7 @@ public:
NfsConnection(EventLoop &_loop,
const char *_server, const char *_export_name) noexcept
:SocketMonitor(_loop),
DeferredMonitor(_loop),
defer_new_lease(_loop, BIND_THIS_METHOD(RunDeferred)),
mount_timeout_event(_loop, BIND_THIS_METHOD(OnMountTimeout)),
server(_server), export_name(_export_name),
context(nullptr) {}
@ -235,8 +236,8 @@ private:
/* callback for #mount_timeout_event */
void OnMountTimeout();
/* virtual methods from DeferredMonitor */
virtual void RunDeferred() override;
/* DeferEvent callback */
void RunDeferred() noexcept;
};
#endif

View File

@ -33,7 +33,7 @@
#include <sys/stat.h>
NfsFileReader::NfsFileReader()
:DeferredMonitor(nfs_get_event_loop())
:defer_open(nfs_get_event_loop(), BIND_THIS_METHOD(OnDeferredOpen))
{
}
@ -50,7 +50,7 @@ NfsFileReader::Close()
if (state == State::DEFER) {
state = State::INITIAL;
DeferredMonitor::Cancel();
defer_open.Cancel();
return;
}
@ -122,7 +122,7 @@ NfsFileReader::Open(const char *uri)
}
state = State::DEFER;
DeferredMonitor::Schedule();
defer_open.Schedule();
}
void
@ -272,7 +272,7 @@ NfsFileReader::OnNfsError(std::exception_ptr &&e)
}
void
NfsFileReader::RunDeferred()
NfsFileReader::OnDeferredOpen() noexcept
{
assert(state == State::DEFER);

View File

@ -23,7 +23,7 @@
#include "check.h"
#include "Lease.hxx"
#include "Callback.hxx"
#include "event/DeferredMonitor.hxx"
#include "event/DeferEvent.hxx"
#include "Compiler.h"
#include <string>
@ -43,7 +43,7 @@ class NfsConnection;
* To get started, derive your class from it and implement the pure
* virtual methods, construct an instance, and call Open().
*/
class NfsFileReader : NfsLease, NfsCallback, DeferredMonitor {
class NfsFileReader : NfsLease, NfsCallback {
enum class State {
INITIAL,
DEFER,
@ -63,11 +63,15 @@ class NfsFileReader : NfsLease, NfsCallback, DeferredMonitor {
nfsfh *fh;
DeferEvent defer_open;
public:
NfsFileReader();
~NfsFileReader();
using DeferredMonitor::GetEventLoop;
EventLoop &GetEventLoop() noexcept {
return defer_open.GetEventLoop();
}
void Close();
void DeferClose();
@ -146,8 +150,8 @@ private:
void OnNfsCallback(unsigned status, void *data) final;
void OnNfsError(std::exception_ptr &&e) final;
/* virtual methods from DeferredMonitor */
void RunDeferred() final;
/* DeferEvent callback */
void OnDeferredOpen() noexcept;
};
#endif

View File

@ -33,7 +33,7 @@
#include "thread/Cond.hxx"
#include "event/Loop.hxx"
#include "event/Call.hxx"
#include "event/DeferredMonitor.hxx"
#include "event/DeferEvent.hxx"
#include "event/TimerEvent.hxx"
#include "util/StringCompare.hxx"
@ -49,7 +49,7 @@ extern "C" {
#include <fcntl.h>
class NfsStorage final
: public Storage, NfsLease, DeferredMonitor {
: public Storage, NfsLease {
enum class State {
INITIAL, CONNECTING, READY, DELAY,
@ -61,6 +61,7 @@ class NfsStorage final
NfsConnection *connection;
DeferEvent defer_connect;
TimerEvent reconnect_timer;
Mutex mutex;
@ -71,10 +72,10 @@ class NfsStorage final
public:
NfsStorage(EventLoop &_loop, const char *_base,
std::string &&_server, std::string &&_export_name)
:DeferredMonitor(_loop),
base(_base),
:base(_base),
server(std::move(_server)),
export_name(std::move(_export_name)),
defer_connect(_loop, BIND_THIS_METHOD(OnDeferredConnect)),
reconnect_timer(_loop, BIND_THIS_METHOD(OnReconnectTimer)) {
nfs_init(_loop);
}
@ -114,8 +115,8 @@ public:
reconnect_timer.Schedule(std::chrono::seconds(5));
}
/* virtual methods from DeferredMonitor */
void RunDeferred() final {
/* DeferEvent callback */
void OnDeferredConnect() noexcept {
if (state == State::INITIAL)
Connect();
}
@ -129,7 +130,7 @@ public:
private:
EventLoop &GetEventLoop() {
return DeferredMonitor::GetEventLoop();
return defer_connect.GetEventLoop();
}
void SetState(State _state) {
@ -173,7 +174,7 @@ private:
case State::INITIAL:
/* schedule connect */
mutex.unlock();
DeferredMonitor::Schedule();
defer_connect.Schedule();
mutex.lock();
if (state == State::INITIAL)
cond.wait(mutex);
@ -195,7 +196,7 @@ private:
switch (state) {
case State::INITIAL:
DeferredMonitor::Cancel();
defer_connect.Cancel();
break;
case State::CONNECTING: