aboutsummaryrefslogtreecommitdiffstats
path: root/src/event/DeferredMonitor.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/DeferredMonitor.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/DeferredMonitor.cxx')
-rw-r--r--src/event/DeferredMonitor.cxx26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/event/DeferredMonitor.cxx b/src/event/DeferredMonitor.cxx
index 5e6d87f30..4ffffaa89 100644
--- a/src/event/DeferredMonitor.cxx
+++ b/src/event/DeferredMonitor.cxx
@@ -24,20 +24,44 @@
void
DeferredMonitor::Cancel()
{
+#ifdef USE_EPOLL
+ pending = false;
+#else
const auto id = source_id.exchange(0);
if (id != 0)
g_source_remove(id);
+#endif
}
void
DeferredMonitor::Schedule()
{
+#ifdef USE_EPOLL
+ if (!pending.exchange(true))
+ fd.Write();
+#else
const unsigned id = loop.AddIdle(Callback, this);
const auto old_id = source_id.exchange(id);
if (old_id != 0)
g_source_remove(old_id);
+#endif
}
+#ifdef USE_EPOLL
+
+bool
+DeferredMonitor::OnSocketReady(unsigned)
+{
+ fd.Read();
+
+ if (pending.exchange(false))
+ RunDeferred();
+
+ return true;
+}
+
+#else
+
void
DeferredMonitor::Run()
{
@@ -53,3 +77,5 @@ DeferredMonitor::Callback(gpointer data)
monitor.Run();
return false;
}
+
+#endif