diff options
author | Max Kellermann <max@musicpd.org> | 2016-12-27 23:06:34 +0100 |
---|---|---|
committer | Max Kellermann <max@musicpd.org> | 2016-12-28 01:15:08 +0100 |
commit | b042095ac239be78a704293f217328b7f1b4cc16 (patch) | |
tree | fcf5cc24aa212066562cef91dc24df2c89fd402f | |
parent | 3413d1bf23a7ba4f33d015d1ec5024c191fe08e5 (diff) |
event/Loop: use std::chrono
-rw-r--r-- | src/Main.cxx | 2 | ||||
-rw-r--r-- | src/StateFile.cxx | 7 | ||||
-rw-r--r-- | src/StateFile.hxx | 7 | ||||
-rw-r--r-- | src/client/ClientExpire.cxx | 2 | ||||
-rw-r--r-- | src/client/ClientGlobal.cxx | 8 | ||||
-rw-r--r-- | src/client/ClientIdle.cxx | 2 | ||||
-rw-r--r-- | src/client/ClientInternal.hxx | 4 | ||||
-rw-r--r-- | src/client/ClientNew.cxx | 2 | ||||
-rw-r--r-- | src/client/ClientRead.cxx | 2 | ||||
-rw-r--r-- | src/db/update/InotifyQueue.cxx | 7 | ||||
-rw-r--r-- | src/event/Loop.cxx | 36 | ||||
-rw-r--r-- | src/event/Loop.hxx | 24 | ||||
-rw-r--r-- | src/event/MultiSocketMonitor.cxx | 6 | ||||
-rw-r--r-- | src/event/MultiSocketMonitor.hxx | 4 | ||||
-rw-r--r-- | src/event/TimeoutMonitor.cxx | 13 | ||||
-rw-r--r-- | src/event/TimeoutMonitor.hxx | 5 | ||||
-rw-r--r-- | src/input/plugins/AlsaInputPlugin.cxx | 10 | ||||
-rw-r--r-- | src/input/plugins/CurlInputPlugin.cxx | 2 | ||||
-rw-r--r-- | src/lib/nfs/Connection.cxx | 5 | ||||
-rw-r--r-- | src/mixer/plugins/AlsaMixerPlugin.cxx | 8 | ||||
-rw-r--r-- | src/storage/plugins/NfsStorage.cxx | 4 | ||||
-rw-r--r-- | src/zeroconf/AvahiPoll.cxx | 10 |
22 files changed, 92 insertions, 78 deletions
diff --git a/src/Main.cxx b/src/Main.cxx index 9360fd898..a0e111c0d 100644 --- a/src/Main.cxx +++ b/src/Main.cxx @@ -258,7 +258,7 @@ glue_state_file_init() #endif } - const unsigned interval = + const auto interval = config_get_unsigned(ConfigOption::STATE_FILE_INTERVAL, StateFile::DEFAULT_INTERVAL); diff --git a/src/StateFile.cxx b/src/StateFile.cxx index ab1cbdb39..20ce04a7d 100644 --- a/src/StateFile.cxx +++ b/src/StateFile.cxx @@ -37,7 +37,10 @@ static constexpr Domain state_file_domain("state_file"); -StateFile::StateFile(AllocatedPath &&_path, unsigned _interval, +constexpr std::chrono::steady_clock::duration StateFile::DEFAULT_INTERVAL; + +StateFile::StateFile(AllocatedPath &&_path, + std::chrono::steady_clock::duration _interval, Partition &_partition, EventLoop &_loop) :TimeoutMonitor(_loop), path(std::move(_path)), path_utf8(path.ToUTF8()), @@ -135,7 +138,7 @@ void StateFile::CheckModified() { if (!IsActive() && IsModified()) - ScheduleSeconds(interval); + Schedule(interval); } void diff --git a/src/StateFile.hxx b/src/StateFile.hxx index 8c59db6ef..733713e2e 100644 --- a/src/StateFile.hxx +++ b/src/StateFile.hxx @@ -25,6 +25,7 @@ #include "Compiler.h" #include <string> +#include <chrono> struct Partition; class OutputStream; @@ -34,7 +35,7 @@ class StateFile final : private TimeoutMonitor { const AllocatedPath path; const std::string path_utf8; - const unsigned interval; + const std::chrono::steady_clock::duration interval; Partition &partition; @@ -46,9 +47,9 @@ class StateFile final : private TimeoutMonitor { prev_playlist_version = 0; public: - static constexpr unsigned DEFAULT_INTERVAL = 2 * 60; + static constexpr std::chrono::steady_clock::duration DEFAULT_INTERVAL = std::chrono::minutes(2); - StateFile(AllocatedPath &&path, unsigned interval, + StateFile(AllocatedPath &&path, std::chrono::steady_clock::duration interval, Partition &partition, EventLoop &loop); void Read(); diff --git a/src/client/ClientExpire.cxx b/src/client/ClientExpire.cxx index 826999650..e290d5254 100644 --- a/src/client/ClientExpire.cxx +++ b/src/client/ClientExpire.cxx @@ -28,7 +28,7 @@ Client::SetExpired() return; FullyBufferedSocket::Close(); - TimeoutMonitor::Schedule(0); + TimeoutMonitor::Schedule(std::chrono::steady_clock::duration::zero()); } void diff --git a/src/client/ClientGlobal.cxx b/src/client/ClientGlobal.cxx index 17d3c08da..7cfa92ed2 100644 --- a/src/client/ClientGlobal.cxx +++ b/src/client/ClientGlobal.cxx @@ -25,14 +25,16 @@ #define CLIENT_MAX_COMMAND_LIST_DEFAULT (2048*1024) #define CLIENT_MAX_OUTPUT_BUFFER_SIZE_DEFAULT (8192*1024) -int client_timeout; +std::chrono::steady_clock::duration client_timeout; size_t client_max_command_list_size; size_t client_max_output_buffer_size; void client_manager_init(void) { - client_timeout = config_get_positive(ConfigOption::CONN_TIMEOUT, - CLIENT_TIMEOUT_DEFAULT); + unsigned client_timeout_s = config_get_positive(ConfigOption::CONN_TIMEOUT, + CLIENT_TIMEOUT_DEFAULT); + client_timeout = std::chrono::seconds(client_timeout_s); + client_max_command_list_size = config_get_positive(ConfigOption::MAX_COMMAND_LIST_SIZE, CLIENT_MAX_COMMAND_LIST_DEFAULT / 1024) diff --git a/src/client/ClientIdle.cxx b/src/client/ClientIdle.cxx index 2a8e1ca89..147d54997 100644 --- a/src/client/ClientIdle.cxx +++ b/src/client/ClientIdle.cxx @@ -42,7 +42,7 @@ Client::IdleNotify() client_puts(*this, "OK\n"); - TimeoutMonitor::ScheduleSeconds(client_timeout); + TimeoutMonitor::Schedule(client_timeout); } void diff --git a/src/client/ClientInternal.hxx b/src/client/ClientInternal.hxx index f8ccab341..4f79e97df 100644 --- a/src/client/ClientInternal.hxx +++ b/src/client/ClientInternal.hxx @@ -24,12 +24,14 @@ #include "Client.hxx" #include "command/CommandResult.hxx" +#include <chrono> + static constexpr unsigned CLIENT_MAX_SUBSCRIPTIONS = 16; static constexpr unsigned CLIENT_MAX_MESSAGES = 64; extern const class Domain client_domain; -extern int client_timeout; +extern std::chrono::steady_clock::duration client_timeout; extern size_t client_max_command_list_size; extern size_t client_max_output_buffer_size; diff --git a/src/client/ClientNew.cxx b/src/client/ClientNew.cxx index acd8de927..46bb3613e 100644 --- a/src/client/ClientNew.cxx +++ b/src/client/ClientNew.cxx @@ -53,7 +53,7 @@ Client::Client(EventLoop &_loop, Partition &_partition, idle_waiting(false), idle_flags(0), num_subscriptions(0) { - TimeoutMonitor::ScheduleSeconds(client_timeout); + TimeoutMonitor::Schedule(client_timeout); } void diff --git a/src/client/ClientRead.cxx b/src/client/ClientRead.cxx index fdd8b341a..5238110fa 100644 --- a/src/client/ClientRead.cxx +++ b/src/client/ClientRead.cxx @@ -34,7 +34,7 @@ Client::OnSocketInput(void *data, size_t length) if (newline == nullptr) return InputResult::MORE; - TimeoutMonitor::ScheduleSeconds(client_timeout); + TimeoutMonitor::Schedule(client_timeout); BufferedSocket::ConsumeInput(newline + 1 - p); diff --git a/src/db/update/InotifyQueue.cxx b/src/db/update/InotifyQueue.cxx index 2ce77fcec..8ed492b4c 100644 --- a/src/db/update/InotifyQueue.cxx +++ b/src/db/update/InotifyQueue.cxx @@ -29,7 +29,8 @@ * update_enqueue(). This increases the probability that updates can * be bundled. */ -static constexpr unsigned INOTIFY_UPDATE_DELAY_S = 5; +static constexpr std::chrono::steady_clock::duration INOTIFY_UPDATE_DELAY = + std::chrono::seconds(5); void InotifyQueue::OnTimeout() @@ -42,7 +43,7 @@ InotifyQueue::OnTimeout() id = update.Enqueue(uri_utf8, false); if (id == 0) { /* retry later */ - ScheduleSeconds(INOTIFY_UPDATE_DELAY_S); + Schedule(INOTIFY_UPDATE_DELAY); return; } @@ -68,7 +69,7 @@ path_in(const char *path, const char *possible_parent) void InotifyQueue::Enqueue(const char *uri_utf8) { - ScheduleSeconds(INOTIFY_UPDATE_DELAY_S); + Schedule(INOTIFY_UPDATE_DELAY); for (auto i = queue.begin(), end = queue.end(); i != end;) { const char *current_uri = i->c_str(); diff --git a/src/event/Loop.cxx b/src/event/Loop.cxx index 82e68ff7e..56e12b756 100644 --- a/src/event/Loop.cxx +++ b/src/event/Loop.cxx @@ -19,8 +19,6 @@ #include "config.h" #include "Loop.hxx" - -#include "system/Clock.hxx" #include "TimeoutMonitor.hxx" #include "SocketMonitor.hxx" #include "IdleMonitor.hxx" @@ -29,8 +27,7 @@ #include <algorithm> EventLoop::EventLoop() - :SocketMonitor(*this), - now_ms(::MonotonicClockMS()) + :SocketMonitor(*this) { SocketMonitor::Open(wake_fd.Get()); SocketMonitor::Schedule(SocketMonitor::READ); @@ -93,13 +90,13 @@ EventLoop::RemoveIdle(IdleMonitor &i) } void -EventLoop::AddTimer(TimeoutMonitor &t, unsigned ms) +EventLoop::AddTimer(TimeoutMonitor &t, std::chrono::steady_clock::duration d) { /* can't use IsInsideOrVirgin() here because libavahi-client modifies the timeout during avahi_client_free() */ assert(IsInsideOrNull()); - timers.insert(TimerRecord(t, now_ms + ms)); + timers.insert(TimerRecord(t, now + d)); again = true; } @@ -116,6 +113,19 @@ EventLoop::CancelTimer(TimeoutMonitor &t) } } +/** + * Convert the given timeout specification to a milliseconds integer, + * to be used by functions like poll() and epoll_wait(). Any negative + * value (= never times out) is translated to the magic value -1. + */ +static constexpr int +ExportTimeoutMS(std::chrono::steady_clock::duration timeout) +{ + return timeout >= timeout.zero() + ? int(std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count()) + : -1; +} + void EventLoop::Run() { @@ -132,21 +142,21 @@ EventLoop::Run() assert(busy); do { - now_ms = ::MonotonicClockMS(); + now = std::chrono::steady_clock::now(); again = false; /* invoke timers */ - int timeout_ms; + std::chrono::steady_clock::duration timeout; while (true) { auto i = timers.begin(); if (i == timers.end()) { - timeout_ms = -1; + timeout = std::chrono::steady_clock::duration(-1); break; } - timeout_ms = i->due_ms - now_ms; - if (timeout_ms > 0) + timeout = i->due - now; + if (timeout > timeout.zero()) break; TimeoutMonitor &m = i->timer; @@ -185,9 +195,9 @@ EventLoop::Run() /* wait for new event */ - poll_group.ReadEvents(poll_result, timeout_ms); + poll_group.ReadEvents(poll_result, ExportTimeoutMS(timeout)); - now_ms = ::MonotonicClockMS(); + now = std::chrono::steady_clock::now(); mutex.lock(); busy = true; diff --git a/src/event/Loop.hxx b/src/event/Loop.hxx index a658520fe..0c7269b10 100644 --- a/src/event/Loop.hxx +++ b/src/event/Loop.hxx @@ -29,6 +29,7 @@ #include "WakeFD.hxx" #include "SocketMonitor.hxx" +#include <chrono> #include <list> #include <set> @@ -54,20 +55,20 @@ class EventLoop final : SocketMonitor * Projected monotonic_clock_ms() value when this * timer is due. */ - const unsigned due_ms; + const std::chrono::steady_clock::time_point due; TimeoutMonitor &timer; constexpr TimerRecord(TimeoutMonitor &_timer, - unsigned _due_ms) - :due_ms(_due_ms), timer(_timer) {} + std::chrono::steady_clock::time_point _due) + :due(_due), timer(_timer) {} bool operator<(const TimerRecord &other) const { - return due_ms < other.due_ms; + return due < other.due; } - bool IsDue(unsigned _now_ms) const { - return _now_ms >= due_ms; + bool IsDue(std::chrono::steady_clock::time_point _now) const { + return _now >= due; } }; @@ -79,7 +80,7 @@ class EventLoop final : SocketMonitor Mutex mutex; std::list<DeferredMonitor *> deferred; - unsigned now_ms; + std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); bool quit = false; @@ -118,12 +119,12 @@ public: ~EventLoop(); /** - * A caching wrapper for MonotonicClockMS(). + * A caching wrapper for std::chrono::steady_clock::now(). */ - unsigned GetTimeMS() const { + std::chrono::steady_clock::time_point GetTime() const { assert(IsInside()); - return now_ms; + return now; } /** @@ -157,7 +158,8 @@ public: void AddIdle(IdleMonitor &i); void RemoveIdle(IdleMonitor &i); - void AddTimer(TimeoutMonitor &t, unsigned ms); + void AddTimer(TimeoutMonitor &t, + std::chrono::steady_clock::duration d); void CancelTimer(TimeoutMonitor &t); /** diff --git a/src/event/MultiSocketMonitor.cxx b/src/event/MultiSocketMonitor.cxx index e67295065..c56b05730 100644 --- a/src/event/MultiSocketMonitor.cxx +++ b/src/event/MultiSocketMonitor.cxx @@ -73,9 +73,9 @@ MultiSocketMonitor::ReplaceSocketList(pollfd *pfds, unsigned n) void MultiSocketMonitor::Prepare() { - int timeout_ms = PrepareSockets(); - if (timeout_ms >= 0) - TimeoutMonitor::Schedule(timeout_ms); + const auto timeout = PrepareSockets(); + if (timeout >= timeout.zero()) + TimeoutMonitor::Schedule(timeout); else TimeoutMonitor::Cancel(); diff --git a/src/event/MultiSocketMonitor.hxx b/src/event/MultiSocketMonitor.hxx index b2e3b4400..e52355d54 100644 --- a/src/event/MultiSocketMonitor.hxx +++ b/src/event/MultiSocketMonitor.hxx @@ -163,9 +163,9 @@ public: protected: /** - * @return timeout [ms] or -1 for no timeout + * @return timeout or a negative value for no timeout */ - virtual int PrepareSockets() = 0; + virtual std::chrono::steady_clock::duration PrepareSockets() = 0; virtual void DispatchSockets() = 0; private: diff --git a/src/event/TimeoutMonitor.cxx b/src/event/TimeoutMonitor.cxx index 9dbf7f4c5..bb393a5c3 100644 --- a/src/event/TimeoutMonitor.cxx +++ b/src/event/TimeoutMonitor.cxx @@ -31,21 +31,12 @@ TimeoutMonitor::Cancel() } void - -TimeoutMonitor::Schedule(unsigned ms) +TimeoutMonitor::Schedule(std::chrono::steady_clock::duration d) { Cancel(); active = true; - loop.AddTimer(*this, ms); -} - -void -TimeoutMonitor::ScheduleSeconds(unsigned s) -{ - Cancel(); - - Schedule(s * 1000u); + loop.AddTimer(*this, d); } void diff --git a/src/event/TimeoutMonitor.hxx b/src/event/TimeoutMonitor.hxx index 9e5caf1f7..32b791d8e 100644 --- a/src/event/TimeoutMonitor.hxx +++ b/src/event/TimeoutMonitor.hxx @@ -22,6 +22,8 @@ #include "check.h" +#include <chrono> + class EventLoop; /** @@ -56,8 +58,7 @@ public: return active; } - void Schedule(unsigned ms); - void ScheduleSeconds(unsigned s); + void Schedule(std::chrono::steady_clock::duration d); void Cancel(); protected: diff --git a/src/input/plugins/AlsaInputPlugin.cxx b/src/input/plugins/AlsaInputPlugin.cxx index 8e337b1b7..f87483c4e 100644 --- a/src/input/plugins/AlsaInputPlugin.cxx +++ b/src/input/plugins/AlsaInputPlugin.cxx @@ -136,7 +136,7 @@ private: InvalidateSockets(); } - virtual int PrepareSockets() override; + virtual std::chrono::steady_clock::duration PrepareSockets() override; virtual void DispatchSockets() override; }; @@ -165,18 +165,18 @@ AlsaInputStream::Create(const char *uri, Mutex &mutex, Cond &cond) handle, frame_size); } -int +std::chrono::steady_clock::duration AlsaInputStream::PrepareSockets() { if (IsPaused()) { ClearSocketList(); - return -1; + return std::chrono::steady_clock::duration(-1); } int count = snd_pcm_poll_descriptors_count(capture_handle); if (count < 0) { ClearSocketList(); - return -1; + return std::chrono::steady_clock::duration(-1); } struct pollfd *pfds = pfd_buffer.Get(count); @@ -186,7 +186,7 @@ AlsaInputStream::PrepareSockets() count = 0; ReplaceSocketList(pfds, count); - return -1; + return std::chrono::steady_clock::duration(-1); } void diff --git a/src/input/plugins/CurlInputPlugin.cxx b/src/input/plugins/CurlInputPlugin.cxx index 727e7f718..7f5f3991c 100644 --- a/src/input/plugins/CurlInputPlugin.cxx +++ b/src/input/plugins/CurlInputPlugin.cxx @@ -511,7 +511,7 @@ CurlGlobal::TimerFunction(gcc_unused CURLM *_global, long timeout_ms, void *user of 10ms. */ timeout_ms = 10; - global.Schedule(timeout_ms); + global.Schedule(std::chrono::milliseconds(timeout_ms)); return 0; } diff --git a/src/lib/nfs/Connection.cxx b/src/lib/nfs/Connection.cxx index 5f6ab4ca9..ec8c6ea90 100644 --- a/src/lib/nfs/Connection.cxx +++ b/src/lib/nfs/Connection.cxx @@ -33,7 +33,8 @@ extern "C" { #include <poll.h> /* for POLLIN, POLLOUT */ -static constexpr unsigned NFS_MOUNT_TIMEOUT = 60; +static constexpr std::chrono::steady_clock::duration NFS_MOUNT_TIMEOUT = + std::chrono::minutes(1); inline void NfsConnection::CancellableCallback::Stat(nfs_context *ctx, @@ -541,7 +542,7 @@ NfsConnection::MountInternal() postponed_mount_error = std::exception_ptr(); mount_finished = false; - TimeoutMonitor::ScheduleSeconds(NFS_MOUNT_TIMEOUT); + TimeoutMonitor::Schedule(NFS_MOUNT_TIMEOUT); #ifndef NDEBUG in_service = false; diff --git a/src/mixer/plugins/AlsaMixerPlugin.cxx b/src/mixer/plugins/AlsaMixerPlugin.cxx index be43b3d33..ee1a72cc5 100644 --- a/src/mixer/plugins/AlsaMixerPlugin.cxx +++ b/src/mixer/plugins/AlsaMixerPlugin.cxx @@ -55,7 +55,7 @@ private: InvalidateSockets(); } - virtual int PrepareSockets() override; + virtual std::chrono::steady_clock::duration PrepareSockets() override; virtual void DispatchSockets() override; }; @@ -93,12 +93,12 @@ public: static constexpr Domain alsa_mixer_domain("alsa_mixer"); -int +std::chrono::steady_clock::duration AlsaMixerMonitor::PrepareSockets() { if (mixer == nullptr) { ClearSocketList(); - return -1; + return std::chrono::steady_clock::duration(-1); } int count = snd_mixer_poll_descriptors_count(mixer); @@ -112,7 +112,7 @@ AlsaMixerMonitor::PrepareSockets() count = 0; ReplaceSocketList(pfds, count); - return -1; + return std::chrono::steady_clock::duration(-1); } void diff --git a/src/storage/plugins/NfsStorage.cxx b/src/storage/plugins/NfsStorage.cxx index ba2e54556..f4f16edbc 100644 --- a/src/storage/plugins/NfsStorage.cxx +++ b/src/storage/plugins/NfsStorage.cxx @@ -102,14 +102,14 @@ public: assert(state == State::CONNECTING); SetState(State::DELAY, std::move(e)); - TimeoutMonitor::ScheduleSeconds(60); + TimeoutMonitor::Schedule(std::chrono::minutes(1)); } void OnNfsConnectionDisconnected(std::exception_ptr e) final { assert(state == State::READY); SetState(State::DELAY, std::move(e)); - TimeoutMonitor::ScheduleSeconds(5); + TimeoutMonitor::Schedule(std::chrono::seconds(5)); } /* virtual methods from DeferredMonitor */ diff --git a/src/zeroconf/AvahiPoll.cxx b/src/zeroconf/AvahiPoll.cxx index 1cc3d5213..ef6ccef09 100644 --- a/src/zeroconf/AvahiPoll.cxx +++ b/src/zeroconf/AvahiPoll.cxx @@ -78,10 +78,10 @@ protected: } }; -static constexpr unsigned -TimevalToMS(const timeval &tv) +static constexpr std::chrono::steady_clock::duration +TimevalToChrono(const timeval &tv) { - return tv.tv_sec * 1000 + (tv.tv_usec + 500) / 1000; + return std::chrono::seconds(tv.tv_sec) + std::chrono::microseconds(tv.tv_usec); } struct AvahiTimeout final : private TimeoutMonitor { @@ -96,12 +96,12 @@ public: :TimeoutMonitor(_loop), callback(_callback), userdata(_userdata) { if (tv != nullptr) - Schedule(TimevalToMS(*tv)); + Schedule(TimevalToChrono(*tv)); } static void TimeoutUpdate(AvahiTimeout *t, const struct timeval *tv) { if (tv != nullptr) - t->Schedule(TimevalToMS(*tv)); + t->Schedule(TimevalToChrono(*tv)); else t->Cancel(); } |