[Spice-devel] [PATCH spice-gtk 11/34] coroutine-gthread: fix GThread deprecations
marcandre.lureau at redhat.com
marcandre.lureau at redhat.com
Mon Jan 7 08:00:40 UTC 2019
From: Marc-André Lureau <marcandre.lureau at redhat.com>
spice-gtk requires glib 2.46.
Modernize a bit coroutine-gthread.
Signed-off-by: Marc-André Lureau <marcandre.lureau at redhat.com>
---
src/coroutine_gthread.c | 56 ++++++++++++++++-------------------------
1 file changed, 22 insertions(+), 34 deletions(-)
diff --git a/src/coroutine_gthread.c b/src/coroutine_gthread.c
index b0098fa..c7e903d 100644
--- a/src/coroutine_gthread.c
+++ b/src/coroutine_gthread.c
@@ -24,8 +24,8 @@
#include <stdio.h>
#include <stdlib.h>
-static GCond *run_cond;
-static GMutex *run_lock;
+static GCond run_cond;
+static GMutex run_lock;;
static struct coroutine *current;
static struct coroutine leader;
@@ -37,19 +37,18 @@ static struct coroutine leader;
static void coroutine_system_init(void)
{
- if (!g_thread_supported()) {
- CO_DEBUG("INIT");
- g_thread_init(NULL);
- }
+ if (current != NULL)
+ return;
+
+ CO_DEBUG("INIT");
+ g_cond_init(&run_cond);
- run_cond = g_cond_new();
- run_lock = g_mutex_new();
CO_DEBUG("LOCK");
- g_mutex_lock(run_lock);
+ g_mutex_lock(&run_lock);
- /* The thread that creates the first coroutine is the system coroutine
- * so let's fill out a structure for it */
+ /* The thread that creates the first coroutine is the system
+ * coroutine so let's fill out a structure for it */
leader.entry = NULL;
leader.release = NULL;
leader.stack_size = 0;
@@ -66,10 +65,10 @@ static gpointer coroutine_thread(gpointer opaque)
{
struct coroutine *co = opaque;
CO_DEBUG("LOCK");
- g_mutex_lock(run_lock);
+ g_mutex_lock(&run_lock);
while (!co->runnable) {
CO_DEBUG("WAIT");
- g_cond_wait(run_cond, run_lock);
+ g_cond_wait(&run_cond, &run_lock);
}
CO_DEBUG("RUNNABLE");
@@ -79,28 +78,19 @@ static gpointer coroutine_thread(gpointer opaque)
co->caller->runnable = TRUE;
CO_DEBUG("BROADCAST");
- g_cond_broadcast(run_cond);
+ g_cond_broadcast(&run_cond);
CO_DEBUG("UNLOCK");
- g_mutex_unlock(run_lock);
+ g_mutex_unlock(&run_lock);
return NULL;
}
void coroutine_init(struct coroutine *co)
{
- GError *err = NULL;
-
- if (run_cond == NULL)
- coroutine_system_init();
-
+ coroutine_system_init();
CO_DEBUG("NEW");
- co->thread = g_thread_create_full(coroutine_thread, co, co->stack_size,
- FALSE, TRUE,
- G_THREAD_PRIORITY_NORMAL,
- &err);
- if (err != NULL)
- g_error("g_thread_create_full() failed: %s", err->message);
-
+ co->thread = g_thread_new("coroutine-thread",
+ coroutine_thread, co);
co->exited = 0;
co->runnable = FALSE;
co->caller = NULL;
@@ -118,14 +108,14 @@ void *coroutine_swap(struct coroutine *from, struct coroutine *to, void *arg)
to->data = arg;
to->caller = from;
CO_DEBUG("BROADCAST");
- g_cond_broadcast(run_cond);
+ g_cond_broadcast(&run_cond);
CO_DEBUG("UNLOCK");
- g_mutex_unlock(run_lock);
+ g_mutex_unlock(&run_lock);
CO_DEBUG("LOCK");
- g_mutex_lock(run_lock);
+ g_mutex_lock(&run_lock);
while (!from->runnable) {
CO_DEBUG("WAIT");
- g_cond_wait(run_cond, run_lock);
+ g_cond_wait(&run_cond, &run_lock);
}
current = from;
to->caller = NULL;
@@ -136,9 +126,7 @@ void *coroutine_swap(struct coroutine *from, struct coroutine *to, void *arg)
struct coroutine *coroutine_self(void)
{
- if (run_cond == NULL)
- coroutine_system_init();
-
+ coroutine_system_init();
return current;
}
--
2.20.1.2.gb21ebb671b
More information about the Spice-devel
mailing list