summaryrefslogtreecommitdiff
path: root/ext/wpe/WPEThreadedView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ext/wpe/WPEThreadedView.cpp')
-rw-r--r--ext/wpe/WPEThreadedView.cpp53
1 files changed, 36 insertions, 17 deletions
diff --git a/ext/wpe/WPEThreadedView.cpp b/ext/wpe/WPEThreadedView.cpp
index cbc5b9f4b..d3c85b5a6 100644
--- a/ext/wpe/WPEThreadedView.cpp
+++ b/ext/wpe/WPEThreadedView.cpp
@@ -98,30 +98,49 @@ WPEContextThread::~WPEContextThread()
template<typename Function>
void WPEContextThread::dispatch(Function func)
{
- struct Payload {
+ struct Job {
+ Job(Function& f)
+ : func(f)
+ {
+ g_mutex_init(&mutex);
+ g_cond_init(&cond);
+ dispatched = FALSE;
+ }
+ ~Job() {
+ g_mutex_clear(&mutex);
+ g_cond_clear(&cond);
+ }
+
+ void dispatch() {
+ GMutexHolder lock(mutex);
+ func();
+ dispatched = TRUE;
+ g_cond_signal(&cond);
+ }
+
+ void waitCompletion() {
+ GMutexHolder lock(mutex);
+ while(!dispatched) {
+ g_cond_wait(&cond, &mutex);
+ }
+ }
+
Function& func;
+ GMutex mutex;
+ GCond cond;
+ gboolean dispatched;
};
- struct Payload payload { func };
+ struct Job job(func);
GSource* source = g_idle_source_new();
g_source_set_callback(source, [](gpointer data) -> gboolean {
- auto& view = WPEContextThread::singleton();
- GMutexHolder lock(view.threading.mutex);
-
- auto* payload = static_cast<struct Payload*>(data);
- payload->func();
-
- g_cond_signal(&view.threading.cond);
+ auto* job = static_cast<struct Job*>(data);
+ job->dispatch();
return G_SOURCE_REMOVE;
- }, &payload, nullptr);
+ }, &job, nullptr);
g_source_set_priority(source, G_PRIORITY_DEFAULT);
-
- {
- GMutexHolder lock(threading.mutex);
- g_source_attach(source, glib.context);
- g_cond_wait(&threading.cond, &threading.mutex);
- }
-
+ g_source_attach(source, glib.context);
+ job.waitCompletion();
g_source_unref(source);
}