aboutsummaryrefslogtreecommitdiffstats
path: root/src/event/DeferredMonitor.hxx
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2014-04-26 22:11:23 +0200
committerMax Kellermann <max@duempel.org>2014-04-26 22:11:23 +0200
commit0efb67b51e0d9d34c65bbdbd9df567a8a991cc4c (patch)
tree0eabbb79cdf144e36d37b38c8cc9040da5b1ae2a /src/event/DeferredMonitor.hxx
parent54ebf2a699777961ebb30bc4b4fca459880d4329 (diff)
downloadmpd-0efb67b51e0d9d34c65bbdbd9df567a8a991cc4c.tar.gz
mpd-0efb67b51e0d9d34c65bbdbd9df567a8a991cc4c.tar.xz
mpd-0efb67b51e0d9d34c65bbdbd9df567a8a991cc4c.zip
DeferredMonitor: fix race condition when using GLib event loop
Turns out the lock-free code using atomics was not thread-safe. The given callback could be invoked by GLib before the source_id attribute was assigned. This commit changes the DeferredMonitor class to use a Mutex to block the event loop until source_id is assigned. This bug does not exist in the 0.19 branch because it does not use the GLib main loop anymore.
Diffstat (limited to 'src/event/DeferredMonitor.hxx')
-rw-r--r--src/event/DeferredMonitor.hxx5
1 files changed, 4 insertions, 1 deletions
diff --git a/src/event/DeferredMonitor.hxx b/src/event/DeferredMonitor.hxx
index 2380fb66f..2ac832a0a 100644
--- a/src/event/DeferredMonitor.hxx
+++ b/src/event/DeferredMonitor.hxx
@@ -27,6 +27,7 @@
#include "SocketMonitor.hxx"
#include "WakeFD.hxx"
#else
+#include "thread/Mutex.hxx"
#include <glib.h>
#endif
@@ -48,7 +49,9 @@ class DeferredMonitor
#else
EventLoop &loop;
- std::atomic<guint> source_id;
+ Mutex mutex;
+
+ guint source_id;
#endif
public: