aboutsummaryrefslogtreecommitdiffstats
path: root/src/event/DeferredMonitor.hxx
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.hxx
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.hxx')
-rw-r--r--src/event/DeferredMonitor.hxx38
1 files changed, 37 insertions, 1 deletions
diff --git a/src/event/DeferredMonitor.hxx b/src/event/DeferredMonitor.hxx
index ffa83359d..988dce2d8 100644
--- a/src/event/DeferredMonitor.hxx
+++ b/src/event/DeferredMonitor.hxx
@@ -21,8 +21,14 @@
#define MPD_SOCKET_DEFERRED_MONITOR_HXX
#include "check.h"
+#include "gcc.h"
+#ifdef USE_EPOLL
+#include "SocketMonitor.hxx"
+#include "WakeFD.hxx"
+#else
#include <glib.h>
+#endif
#include <atomic>
@@ -31,21 +37,47 @@ class EventLoop;
/**
* Defer execution of an event into an #EventLoop.
*/
-class DeferredMonitor {
+class DeferredMonitor
+#ifdef USE_EPOLL
+ : private SocketMonitor
+#endif
+{
+#ifdef USE_EPOLL
+ std::atomic_bool pending;
+ WakeFD fd;
+#else
EventLoop &loop;
std::atomic<guint> source_id;
+#endif
public:
+#ifdef USE_EPOLL
+ DeferredMonitor(EventLoop &_loop)
+ :SocketMonitor(_loop), pending(false) {
+ SocketMonitor::Open(fd.Get());
+ SocketMonitor::Schedule(SocketMonitor::READ);
+ }
+#else
DeferredMonitor(EventLoop &_loop)
:loop(_loop), source_id(0) {}
+#endif
~DeferredMonitor() {
+#ifdef USE_EPOLL
+ /* avoid closing the WakeFD twice */
+ SocketMonitor::Steal();
+#else
Cancel();
+#endif
}
EventLoop &GetEventLoop() {
+#ifdef USE_EPOLL
+ return SocketMonitor::GetEventLoop();
+#else
return loop;
+#endif
}
void Schedule();
@@ -55,8 +87,12 @@ protected:
virtual void RunDeferred() = 0;
private:
+#ifdef USE_EPOLL
+ virtual bool OnSocketReady(unsigned flags) override final;
+#else
void Run();
static gboolean Callback(gpointer data);
+#endif
};
#endif /* MAIN_NOTIFY_H */