From def962b6cb19c61818de935e1d63734d8a205fcd Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Thu, 4 Feb 2021 20:45:43 +0100 Subject: [PATCH] event/{Coarse,Fine,Far}TimerEvent: aliases for TimerEvent Preparing for a variant of TimerEvent with coarse 1-second granularity, but cheaper (with a timer wheel). --- src/StateFile.hxx | 4 +- src/client/Client.hxx | 4 +- src/db/update/InotifyQueue.hxx | 4 +- src/event/Chrono.hxx | 2 +- src/event/CoarseTimerEvent.hxx | 51 +++++++++++++++++++++++++ src/event/FarTimerEvent.hxx | 48 +++++++++++++++++++++++ src/event/FineTimerEvent.hxx | 49 ++++++++++++++++++++++++ src/event/MultiSocketMonitor.hxx | 5 ++- src/lib/curl/Global.hxx | 4 +- src/lib/nfs/Connection.hxx | 4 +- src/lib/systemd/Watchdog.hxx | 4 +- src/output/plugins/AlsaOutputPlugin.cxx | 3 +- src/storage/plugins/NfsStorage.cxx | 4 +- src/zeroconf/AvahiPoll.cxx | 4 +- 14 files changed, 170 insertions(+), 20 deletions(-) create mode 100644 src/event/CoarseTimerEvent.hxx create mode 100644 src/event/FarTimerEvent.hxx create mode 100644 src/event/FineTimerEvent.hxx diff --git a/src/StateFile.hxx b/src/StateFile.hxx index 3b8e34e66..e94737dc1 100644 --- a/src/StateFile.hxx +++ b/src/StateFile.hxx @@ -21,7 +21,7 @@ #define MPD_STATE_FILE_HXX #include "StateFileConfig.hxx" -#include "event/TimerEvent.hxx" +#include "event/FarTimerEvent.hxx" #include "util/Compiler.h" #include "config.h" @@ -36,7 +36,7 @@ class StateFile final { const std::string path_utf8; - TimerEvent timer_event; + FarTimerEvent timer_event; Partition &partition; diff --git a/src/client/Client.hxx b/src/client/Client.hxx index deb4b8caa..5ddc87a32 100644 --- a/src/client/Client.hxx +++ b/src/client/Client.hxx @@ -25,7 +25,7 @@ #include "command/CommandListBuilder.hxx" #include "tag/Mask.hxx" #include "event/FullyBufferedSocket.hxx" -#include "event/TimerEvent.hxx" +#include "event/CoarseTimerEvent.hxx" #include "util/Compiler.h" #include @@ -54,7 +54,7 @@ class Client final public boost::intrusive::list_base_hook, boost::intrusive::link_mode>, public boost::intrusive::list_base_hook> { - TimerEvent timeout_event; + CoarseTimerEvent timeout_event; Partition *partition; diff --git a/src/db/update/InotifyQueue.hxx b/src/db/update/InotifyQueue.hxx index 04abe8394..f4402a53b 100644 --- a/src/db/update/InotifyQueue.hxx +++ b/src/db/update/InotifyQueue.hxx @@ -20,7 +20,7 @@ #ifndef MPD_INOTIFY_QUEUE_HXX #define MPD_INOTIFY_QUEUE_HXX -#include "event/TimerEvent.hxx" +#include "event/CoarseTimerEvent.hxx" #include #include @@ -32,7 +32,7 @@ class InotifyQueue final { std::list queue; - TimerEvent delay_event; + CoarseTimerEvent delay_event; public: InotifyQueue(EventLoop &_loop, UpdateService &_update) noexcept diff --git a/src/event/Chrono.hxx b/src/event/Chrono.hxx index d2b5815e3..f4f005d60 100644 --- a/src/event/Chrono.hxx +++ b/src/event/Chrono.hxx @@ -25,7 +25,7 @@ namespace Event { /** - * The clock used by class #EventLoop and class #TimerEvent. + * The clock used by classes #EventLoop, #CoarseTimerEvent and #FineTimerEvent. */ using Clock = std::chrono::steady_clock; diff --git a/src/event/CoarseTimerEvent.hxx b/src/event/CoarseTimerEvent.hxx new file mode 100644 index 000000000..6ce03f8cd --- /dev/null +++ b/src/event/CoarseTimerEvent.hxx @@ -0,0 +1,51 @@ +/* + * Copyright 2007-2021 CM4all GmbH + * All rights reserved. + * + * author: Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "TimerEvent.hxx" + +/** + * This class invokes a callback function after a certain amount of + * time. Use Schedule() to start the timer or Cancel() to cancel it. + * + * Unlike #FineTimerEvent, this class has a granularity of about 1 + * second, and is optimized for timeouts between 1 and 60 seconds + * which are often canceled before they expire (i.e. optimized for + * fast insertion and deletion, at the cost of granularity). + * + * This class is not thread-safe, all methods must be called from the + * thread that runs the #EventLoop, except where explicitly documented + * as thread-safe. + */ +using CoarseTimerEvent = TimerEvent; +// TODO: implement diff --git a/src/event/FarTimerEvent.hxx b/src/event/FarTimerEvent.hxx new file mode 100644 index 000000000..203185c83 --- /dev/null +++ b/src/event/FarTimerEvent.hxx @@ -0,0 +1,48 @@ +/* + * Copyright 2007-2021 CM4all GmbH + * All rights reserved. + * + * author: Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "FineTimerEvent.hxx" + +/** + * A coarse timer event which schedules far into the future. Use this + * when you need a coarse resolution, but the supported time span of + * #CoarseTimerEvent is not enough. For example, a good use case is + * timers which fire only every few minutes and do periodic cleanup. + * + * Right now, this is just an alias for #FineTimerEvent. This class + * supports arbitrary time spans, but uses a high-resolution timer. + * Eventually, we may turn this into a timer wheel with minute + * resolution. + */ +using FarTimerEvent = FineTimerEvent; diff --git a/src/event/FineTimerEvent.hxx b/src/event/FineTimerEvent.hxx new file mode 100644 index 000000000..d5a5afed8 --- /dev/null +++ b/src/event/FineTimerEvent.hxx @@ -0,0 +1,49 @@ +/* + * Copyright 2007-2021 CM4all GmbH + * All rights reserved. + * + * author: Max Kellermann + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * - Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * - Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "TimerEvent.hxx" + +/** + * This class invokes a callback function after a certain amount of + * time. Use Schedule() to start the timer or Cancel() to cancel it. + * + * Unlike #CoarseTimerEvent, this class uses a high-resolution timer, + * but at the cost of more expensive insertion and deletion. + * + * This class is not thread-safe, all methods must be called from the + * thread that runs the #EventLoop, except where explicitly documented + * as thread-safe. + */ +using FineTimerEvent = TimerEvent; +// TODO: implement diff --git a/src/event/MultiSocketMonitor.hxx b/src/event/MultiSocketMonitor.hxx index 668eb892d..d1d585794 100644 --- a/src/event/MultiSocketMonitor.hxx +++ b/src/event/MultiSocketMonitor.hxx @@ -21,7 +21,7 @@ #define MPD_MULTI_SOCKET_MONITOR_HXX #include "IdleEvent.hxx" -#include "TimerEvent.hxx" +#include "FineTimerEvent.hxx" #include "SocketEvent.hxx" #include "event/Features.h" @@ -92,7 +92,8 @@ class MultiSocketMonitor IdleEvent idle_event; - TimerEvent timeout_event; + // TODO: switch to CoarseTimerEvent? ... not yet because the ALSA plugin needs exact timeouts + FineTimerEvent timeout_event; /** * DispatchSockets() should be called. diff --git a/src/lib/curl/Global.hxx b/src/lib/curl/Global.hxx index 8eb514994..1988ee699 100644 --- a/src/lib/curl/Global.hxx +++ b/src/lib/curl/Global.hxx @@ -31,7 +31,7 @@ #define CURL_GLOBAL_HXX #include "Multi.hxx" -#include "event/TimerEvent.hxx" +#include "event/CoarseTimerEvent.hxx" #include "event/DeferEvent.hxx" class CurlSocket; @@ -45,7 +45,7 @@ class CurlGlobal final { DeferEvent defer_read_info; - TimerEvent timeout_event; + CoarseTimerEvent timeout_event; public: explicit CurlGlobal(EventLoop &_loop); diff --git a/src/lib/nfs/Connection.hxx b/src/lib/nfs/Connection.hxx index c5bee8234..bf3834541 100644 --- a/src/lib/nfs/Connection.hxx +++ b/src/lib/nfs/Connection.hxx @@ -22,7 +22,7 @@ #include "Cancellable.hxx" #include "event/SocketEvent.hxx" -#include "event/TimerEvent.hxx" +#include "event/CoarseTimerEvent.hxx" #include "event/DeferEvent.hxx" #include "util/Compiler.h" @@ -95,7 +95,7 @@ class NfsConnection { SocketEvent socket_event; DeferEvent defer_new_lease; - TimerEvent mount_timeout_event; + CoarseTimerEvent mount_timeout_event; std::string server, export_name; diff --git a/src/lib/systemd/Watchdog.hxx b/src/lib/systemd/Watchdog.hxx index 1c0fa8d5b..24f87a861 100644 --- a/src/lib/systemd/Watchdog.hxx +++ b/src/lib/systemd/Watchdog.hxx @@ -30,7 +30,7 @@ #ifndef SYSTEMD_WATCHDOG_HXX #define SYSTEMD_WATCHDOG_HXX -#include "event/TimerEvent.hxx" +#include "event/FineTimerEvent.hxx" namespace Systemd { @@ -40,7 +40,7 @@ namespace Systemd { * not enabled, this class does nothing. */ class Watchdog { - TimerEvent timer; + FineTimerEvent timer; Event::Duration interval; diff --git a/src/output/plugins/AlsaOutputPlugin.cxx b/src/output/plugins/AlsaOutputPlugin.cxx index 34a8a964b..af3c48716 100644 --- a/src/output/plugins/AlsaOutputPlugin.cxx +++ b/src/output/plugins/AlsaOutputPlugin.cxx @@ -38,6 +38,7 @@ #include "util/StringView.hxx" #include "event/MultiSocketMonitor.hxx" #include "event/InjectEvent.hxx" +#include "event/FineTimerEvent.hxx" #include "event/Call.hxx" #include "Log.hxx" @@ -64,7 +65,7 @@ class AlsaOutput final * generating silence if Play() doesn't get called soon enough * to avoid the xrun. */ - TimerEvent silence_timer; + FineTimerEvent silence_timer; PeriodClock throttle_silence_log; diff --git a/src/storage/plugins/NfsStorage.cxx b/src/storage/plugins/NfsStorage.cxx index 73bbf334a..e8470b3ef 100644 --- a/src/storage/plugins/NfsStorage.cxx +++ b/src/storage/plugins/NfsStorage.cxx @@ -33,7 +33,7 @@ #include "event/Loop.hxx" #include "event/Call.hxx" #include "event/InjectEvent.hxx" -#include "event/TimerEvent.hxx" +#include "event/CoarseTimerEvent.hxx" #include "util/ASCII.hxx" #include "util/StringCompare.hxx" @@ -62,7 +62,7 @@ class NfsStorage final NfsConnection *connection; InjectEvent defer_connect; - TimerEvent reconnect_timer; + CoarseTimerEvent reconnect_timer; Mutex mutex; Cond cond; diff --git a/src/zeroconf/AvahiPoll.cxx b/src/zeroconf/AvahiPoll.cxx index e07d6d2ba..1753458d2 100644 --- a/src/zeroconf/AvahiPoll.cxx +++ b/src/zeroconf/AvahiPoll.cxx @@ -19,7 +19,7 @@ #include "AvahiPoll.hxx" #include "event/SocketEvent.hxx" -#include "event/TimerEvent.hxx" +#include "event/CoarseTimerEvent.hxx" #include "time/Convert.hxx" static unsigned @@ -77,7 +77,7 @@ private: }; struct AvahiTimeout final { - TimerEvent timer; + CoarseTimerEvent timer; const AvahiTimeoutCallback callback; void *const userdata;