event/MultiSocketMonitor: eliminate virtual method CheckSockets()

Handle timeout internally.
This commit is contained in:
Max Kellermann
2013-08-10 11:21:38 +02:00
parent be0c8495cd
commit 84ac79bb08
3 changed files with 16 additions and 36 deletions

View File

@@ -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)

View File

@@ -52,6 +52,7 @@ class MultiSocketMonitor {
EventLoop &loop;
Source *source;
gint64 absolute_timeout_us;
std::forward_list<GPollFD> 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() {