From 84ac79bb08696230157912a1d927d35004b12e8c Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Sat, 10 Aug 2013 11:21:38 +0200 Subject: event/MultiSocketMonitor: eliminate virtual method CheckSockets() Handle timeout internally. --- src/event/MultiSocketMonitor.cxx | 16 ++++++++++++++-- src/event/MultiSocketMonitor.hxx | 8 ++------ src/input/CurlInputPlugin.cxx | 28 ---------------------------- 3 files changed, 16 insertions(+), 36 deletions(-) diff --git a/src/event/MultiSocketMonitor.cxx b/src/event/MultiSocketMonitor.cxx index d8a9ffd6a..3fcc4375c 100644 --- a/src/event/MultiSocketMonitor.cxx +++ b/src/event/MultiSocketMonitor.cxx @@ -42,7 +42,8 @@ static GSourceFuncs multi_socket_monitor_source_funcs = { MultiSocketMonitor::MultiSocketMonitor(EventLoop &_loop) :loop(_loop), source((Source *)g_source_new(&multi_socket_monitor_source_funcs, - sizeof(*source))) { + sizeof(*source))), + absolute_timeout_us(G_MAXINT64) { source->monitor = this; g_source_attach(&source->base, loop.GetContext()); @@ -55,10 +56,21 @@ MultiSocketMonitor::~MultiSocketMonitor() source = nullptr; } +bool +MultiSocketMonitor::Prepare(gint *timeout_r) +{ + int timeout_ms = *timeout_r = PrepareSockets(); + absolute_timeout_us = timeout_ms < 0 + ? G_MAXINT64 + : GetTime() + gint64(timeout_ms) * 1000; + + return false; +} + bool MultiSocketMonitor::Check() const { - if (CheckSockets()) + if (GetTime() >= absolute_timeout_us) return true; for (const auto &i : fds) diff --git a/src/event/MultiSocketMonitor.hxx b/src/event/MultiSocketMonitor.hxx index 50be18070..941487534 100644 --- a/src/event/MultiSocketMonitor.hxx +++ b/src/event/MultiSocketMonitor.hxx @@ -52,6 +52,7 @@ class MultiSocketMonitor { EventLoop &loop; Source *source; + gint64 absolute_timeout_us; std::forward_list fds; public: @@ -105,7 +106,6 @@ protected: * @return timeout [ms] or -1 for no timeout */ virtual int PrepareSockets() = 0; - virtual bool CheckSockets() const { return false; } virtual void DispatchSockets() = 0; public: @@ -116,11 +116,7 @@ public: gpointer user_data); private: - bool Prepare(gint *timeout_r) { - *timeout_r = PrepareSockets(); - return false; - } - + bool Prepare(gint *timeout_r); bool Check() const; void Dispatch() { diff --git a/src/input/CurlInputPlugin.cxx b/src/input/CurlInputPlugin.cxx index 56a42709a..c5f524bc0 100644 --- a/src/input/CurlInputPlugin.cxx +++ b/src/input/CurlInputPlugin.cxx @@ -183,18 +183,6 @@ struct input_curl { * This class monitors all CURL file descriptors. */ class CurlSockets final : private MultiSocketMonitor { - /** - * Did CURL give us a timeout? If yes, then we need to call - * curl_multi_perform(), even if there was no event on any - * file descriptor. - */ - bool have_timeout; - - /** - * The absolute time stamp when the timeout expires. - */ - gint64 absolute_timeout; - public: CurlSockets(EventLoop &_loop) :MultiSocketMonitor(_loop) {} @@ -205,7 +193,6 @@ private: void UpdateSockets(); virtual int PrepareSockets() override; - virtual bool CheckSockets() const override; virtual void DispatchSockets() override; }; @@ -541,14 +528,9 @@ CurlSockets::PrepareSockets() { UpdateSockets(); - have_timeout = false; - long timeout2; CURLMcode mcode = curl_multi_timeout(curl.multi, &timeout2); if (mcode == CURLM_OK) { - if (timeout2 >= 0) - absolute_timeout = GetTime() + timeout2 * 1000; - if (timeout2 >= 0 && timeout2 < 10) /* CURL 7.21.1 likes to report "timeout=0", which means we're running in a busy loop. @@ -556,7 +538,6 @@ CurlSockets::PrepareSockets() Let's use a lower limit of 10ms. */ timeout2 = 10; - have_timeout = timeout2 >= 0; return timeout2; } else { g_warning("curl_multi_timeout() failed: %s\n", @@ -565,15 +546,6 @@ CurlSockets::PrepareSockets() } } -bool -CurlSockets::CheckSockets() const -{ - /* when a timeout has expired, we need to call - curl_multi_perform(), even if there was no file descriptor - event */ - return have_timeout && GetTime() >= absolute_timeout; -} - void CurlSockets::DispatchSockets() { -- cgit v1.2.3