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 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) (limited to 'src/event/MultiSocketMonitor.cxx') 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) -- cgit v1.2.3