diff options
author | Max Kellermann <max@duempel.org> | 2013-08-07 22:16:59 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-08-10 13:54:23 +0200 |
commit | c1f4f1fdb64d97b5c3461723a8482ca64efea30e (patch) | |
tree | 54c8a9c1466beec0dbfac1c0b5f5773060c1aa2b /src/event/DeferredMonitor.hxx | |
parent | 342333f72a484e9f394026666c4b20e54dc9b756 (diff) | |
download | mpd-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.hxx | 38 |
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 */ |