aboutsummaryrefslogtreecommitdiffstats
path: root/src/event/Loop.hxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-01-04 14:56:02 +0100
committerMax Kellermann <max@duempel.org>2014-01-04 15:58:59 +0100
commita357d84dce668d126fe984680e5d17f6d41b2fe6 (patch)
treea85f021ed1d7f999592f5fb3878a4b723755d1cd /src/event/Loop.hxx
parent48c96bbaea542491b930f244e22d17db5a281434 (diff)
downloadmpd-a357d84dce668d126fe984680e5d17f6d41b2fe6.tar.gz
mpd-a357d84dce668d126fe984680e5d17f6d41b2fe6.tar.xz
mpd-a357d84dce668d126fe984680e5d17f6d41b2fe6.zip
event/DeferredMonitor: make fully thread-safe
Instead of creating a new eventfd for each DeferredMonitor instance, reuse EventLoop's eventfd, and add a std::list to EventLoop that manages the list of pending DeferredMonitors. This std::list is protected by the same mutex as the "calls" list. The bottom line is: reduced overhead because the per-instance eventfd was eliminated, slightly added overhead due to Mutex usage (but negligible), and we're thread-safe now. This subsystem is now good enough to replace EventLoop::AddCall().
Diffstat (limited to 'src/event/Loop.hxx')
-rw-r--r--src/event/Loop.hxx17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/event/Loop.hxx b/src/event/Loop.hxx
index 885e74679..0586a1f68 100644
--- a/src/event/Loop.hxx
+++ b/src/event/Loop.hxx
@@ -42,6 +42,7 @@
#ifdef USE_INTERNAL_EVENTLOOP
class TimeoutMonitor;
class IdleMonitor;
+class DeferredMonitor;
class SocketMonitor;
#endif
@@ -91,6 +92,7 @@ class EventLoop final
Mutex mutex;
std::list<std::function<void()>> calls;
+ std::list<DeferredMonitor *> deferred;
unsigned now_ms;
@@ -162,6 +164,21 @@ public:
void AddCall(std::function<void()> &&f);
/**
+ * Schedule a call to DeferredMonitor::RunDeferred().
+ *
+ * This method is thread-safe.
+ */
+ void AddDeferred(DeferredMonitor &d);
+
+ /**
+ * Cancel a pending call to DeferredMonitor::RunDeferred().
+ * However after returning, the call may still be running.
+ *
+ * This method is thread-safe.
+ */
+ void RemoveDeferred(DeferredMonitor &d);
+
+ /**
* The main function of this class. It will loop until
* Break() gets called. Can be called only once.
*/