aboutsummaryrefslogtreecommitdiffstats
path: root/src/event/IdleMonitor.cxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2013-08-07 22:16:59 +0200
committerMax Kellermann <max@duempel.org>2013-08-10 13:54:23 +0200
commitc1f4f1fdb64d97b5c3461723a8482ca64efea30e (patch)
tree54c8a9c1466beec0dbfac1c0b5f5773060c1aa2b /src/event/IdleMonitor.cxx
parent342333f72a484e9f394026666c4b20e54dc9b756 (diff)
downloadmpd-c1f4f1fdb64d97b5c3461723a8482ca64efea30e.tar.gz
mpd-c1f4f1fdb64d97b5c3461723a8482ca64efea30e.tar.xz
mpd-c1f4f1fdb64d97b5c3461723a8482ca64efea30e.zip
EventLoop: new implementation using epoll
Implement an event loop without GLib.
Diffstat (limited to 'src/event/IdleMonitor.cxx')
-rw-r--r--src/event/IdleMonitor.cxx20
1 files changed, 20 insertions, 0 deletions
diff --git a/src/event/IdleMonitor.cxx b/src/event/IdleMonitor.cxx
index 1ee86f7f5..c99c66b26 100644
--- a/src/event/IdleMonitor.cxx
+++ b/src/event/IdleMonitor.cxx
@@ -29,8 +29,13 @@ IdleMonitor::Cancel()
if (!IsActive())
return;
+#ifdef USE_EPOLL
+ active = false;
+ loop.RemoveIdle(*this);
+#else
g_source_remove(source_id);
source_id = 0;
+#endif
}
void
@@ -42,19 +47,32 @@ IdleMonitor::Schedule()
/* already scheduled */
return;
+#ifdef USE_EPOLL
+ active = true;
+ loop.AddIdle(*this);
+#else
source_id = loop.AddIdle(Callback, this);
+#endif
}
void
IdleMonitor::Run()
{
assert(loop.IsInside());
+
+#ifdef USE_EPOLL
+ assert(active);
+ active = false;
+#else
assert(source_id != 0);
source_id = 0;
+#endif
OnIdle();
}
+#ifndef USE_EPOLL
+
gboolean
IdleMonitor::Callback(gpointer data)
{
@@ -62,3 +80,5 @@ IdleMonitor::Callback(gpointer data)
monitor.Run();
return false;
}
+
+#endif