diff options
author | Chanho Park <chanho61.park@samsung.com> | 2014-09-05 20:35:53 +0900 |
---|---|---|
committer | Chanho Park <chanho61.park@samsung.com> | 2014-09-05 20:35:53 +0900 |
commit | 16b1353a36171ae06d63fd309f4772dbfb1da113 (patch) | |
tree | cf6c297ee81aba0d9b47f23d78a889667e7bce48 /coroutine-gthread.c | |
parent | a15119db2ff5c2fdfdeb913b297bf8aa3399132e (diff) | |
download | qemu-16b1353a36171ae06d63fd309f4772dbfb1da113.tar.gz qemu-16b1353a36171ae06d63fd309f4772dbfb1da113.tar.bz2 qemu-16b1353a36171ae06d63fd309f4772dbfb1da113.zip |
Imported Upstream version 2.1.0upstream/2.1.0
Diffstat (limited to 'coroutine-gthread.c')
-rw-r--r-- | coroutine-gthread.c | 36 |
1 files changed, 10 insertions, 26 deletions
diff --git a/coroutine-gthread.c b/coroutine-gthread.c index d3e5b991f..6bd6d6b22 100644 --- a/coroutine-gthread.c +++ b/coroutine-gthread.c @@ -30,20 +30,14 @@ typedef struct { CoroutineAction action; } CoroutineGThread; -static GStaticMutex coroutine_lock = G_STATIC_MUTEX_INIT; +static CompatGMutex coroutine_lock; +static CompatGCond coroutine_cond; /* GLib 2.31 and beyond deprecated various parts of the thread API, * but the new interfaces are not available in older GLib versions * so we have to cope with both. */ #if GLIB_CHECK_VERSION(2, 31, 0) -/* Default zero-initialisation is sufficient for 2.31+ GCond */ -static GCond the_coroutine_cond; -static GCond *coroutine_cond = &the_coroutine_cond; -static inline void init_coroutine_cond(void) -{ -} - /* Awkwardly, the GPrivate API doesn't provide a way to update the * GDestroyNotify handler for the coroutine key dynamically. So instead * we track whether or not the CoroutineGThread should be freed on @@ -84,11 +78,6 @@ static inline GThread *create_thread(GThreadFunc func, gpointer data) #else /* Handle older GLib versions */ -static GCond *coroutine_cond; -static inline void init_coroutine_cond(void) -{ - coroutine_cond = g_cond_new(); -} static GStaticPrivate coroutine_key = G_STATIC_PRIVATE_INIT; @@ -115,30 +104,25 @@ static inline GThread *create_thread(GThreadFunc func, gpointer data) static void __attribute__((constructor)) coroutine_init(void) { - if (!g_thread_supported()) { #if !GLIB_CHECK_VERSION(2, 31, 0) + if (!g_thread_supported()) { g_thread_init(NULL); -#else - fprintf(stderr, "glib threading failed to initialize.\n"); - exit(1); -#endif } - - init_coroutine_cond(); +#endif } static void coroutine_wait_runnable_locked(CoroutineGThread *co) { while (!co->runnable) { - g_cond_wait(coroutine_cond, g_static_mutex_get_mutex(&coroutine_lock)); + g_cond_wait(&coroutine_cond, &coroutine_lock); } } static void coroutine_wait_runnable(CoroutineGThread *co) { - g_static_mutex_lock(&coroutine_lock); + g_mutex_lock(&coroutine_lock); coroutine_wait_runnable_locked(co); - g_static_mutex_unlock(&coroutine_lock); + g_mutex_unlock(&coroutine_lock); } static gpointer coroutine_thread(gpointer opaque) @@ -180,17 +164,17 @@ CoroutineAction qemu_coroutine_switch(Coroutine *from_, CoroutineGThread *from = DO_UPCAST(CoroutineGThread, base, from_); CoroutineGThread *to = DO_UPCAST(CoroutineGThread, base, to_); - g_static_mutex_lock(&coroutine_lock); + g_mutex_lock(&coroutine_lock); from->runnable = false; from->action = action; to->runnable = true; to->action = action; - g_cond_broadcast(coroutine_cond); + g_cond_broadcast(&coroutine_cond); if (action != COROUTINE_TERMINATE) { coroutine_wait_runnable_locked(from); } - g_static_mutex_unlock(&coroutine_lock); + g_mutex_unlock(&coroutine_lock); return from->action; } |