aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax Kellermann <max@duempel.org>2013-08-07 22:49:46 +0200
committerMax Kellermann <max@duempel.org>2013-08-08 23:04:01 +0200
commit9ab0a1f5f16b475199540349905e4d79001b8cec (patch)
tree6ebbce4ce63dcd5bfa7330ce78081171f58046d9
parentc043b337b1747498fb2bf3180decdee4561d0d91 (diff)
downloadmpd-9ab0a1f5f16b475199540349905e4d79001b8cec.tar.gz
mpd-9ab0a1f5f16b475199540349905e4d79001b8cec.tar.xz
mpd-9ab0a1f5f16b475199540349905e4d79001b8cec.zip
EventLoop: add methodd IsInside()
Track which thread runs the EventLoop and provide a check whether we're currently inside.
-rw-r--r--src/event/Loop.cxx5
-rw-r--r--src/event/Loop.hxx23
2 files changed, 26 insertions, 2 deletions
diff --git a/src/event/Loop.cxx b/src/event/Loop.cxx
index 1aaca8820..ad20245de 100644
--- a/src/event/Loop.cxx
+++ b/src/event/Loop.cxx
@@ -23,7 +23,12 @@
void
EventLoop::Run()
{
+ assert(thread == nullptr);
+ thread = g_thread_self();
+
g_main_loop_run(loop);
+
+ assert(thread == g_thread_self());
}
guint
diff --git a/src/event/Loop.hxx b/src/event/Loop.hxx
index a222f098d..02befe79e 100644
--- a/src/event/Loop.hxx
+++ b/src/event/Loop.hxx
@@ -25,25 +25,44 @@
#include <glib.h>
+#include <assert.h>
+
class EventLoop {
GMainContext *context;
GMainLoop *loop;
+ /**
+ * A reference to the thread that is currently inside Run().
+ */
+ GThread *thread;
+
public:
EventLoop()
:context(g_main_context_new()),
- loop(g_main_loop_new(context, false)) {}
+ loop(g_main_loop_new(context, false)),
+ thread(nullptr) {}
struct Default {};
EventLoop(gcc_unused Default _dummy)
:context(g_main_context_ref(g_main_context_default())),
- loop(g_main_loop_new(context, false)) {}
+ loop(g_main_loop_new(context, false)),
+ thread(nullptr) {}
~EventLoop() {
g_main_loop_unref(loop);
g_main_context_unref(context);
}
+ /**
+ * Are we currently running inside this EventLoop's thread?
+ */
+ gcc_pure
+ bool IsInside() const {
+ assert(thread != nullptr);
+
+ return g_thread_self() == thread;
+ }
+
GMainContext *GetContext() {
return context;
}