EventLoop: add methodd IsInside()

Track which thread runs the EventLoop and provide a check whether
we're currently inside.
This commit is contained in:
Max Kellermann 2013-08-07 22:49:46 +02:00
parent c043b337b1
commit 9ab0a1f5f1
2 changed files with 26 additions and 2 deletions

View File

@ -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

View File

@ -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;
}