[PATCH spice-gtk 4/4] coroutine: make gthread coroutine pass tests

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



The coroutine entry() return value must be passed via the caller->data,
since coroutine_swap() returns from->data. (this is needed because
coroutine_swap() argument is used both to return from entry() or to send
data to a running coroutine)

When leaving a coroutine, clear its caller.

Return correct coroutine_self() before other coroutine are initialized.
---
 gtk/coroutine_gthread.c | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/gtk/coroutine_gthread.c b/gtk/coroutine_gthread.c
index 3542a82..6ee2587 100644
--- a/gtk/coroutine_gthread.c
+++ b/gtk/coroutine_gthread.c
@@ -74,7 +74,7 @@ static gpointer coroutine_thread(gpointer opaque)
 
 	CO_DEBUG("RUNNABLE");
 	current = co;
-	co->data = co->entry(co->data);
+	co->caller->data = co->entry(co->data);
 	co->exited = 1;
 
 	co->caller->runnable = TRUE;
@@ -128,6 +128,7 @@ void *coroutine_swap(struct coroutine *from, struct coroutine *to, void *arg)
 		g_cond_wait(run_cond, run_lock);
 	}
 	current = from;
+	to->caller = NULL;
 
 	CO_DEBUG("SWAPPED");
 	return from->data;
@@ -135,6 +136,9 @@ void *coroutine_swap(struct coroutine *from, struct coroutine *to, void *arg)
 
 struct coroutine *coroutine_self(void)
 {
+	if (run_cond == NULL)
+		coroutine_system_init();
+
 	return current;
 }
 
-- 
1.8.3.1

_______________________________________________
Spice-devel mailing list
Spice-devel@xxxxxxxxxxxxxxxxxxxxx
http://lists.freedesktop.org/mailman/listinfo/spice-devel




[Index of Archives]     [Linux ARM Kernel]     [Linux ARM]     [Linux Omap]     [Fedora ARM]     [IETF Annouce]     [Security]     [Bugtraq]     [Linux]     [Linux OMAP]     [Linux MIPS]     [ECOS]     [Asterisk Internet PBX]     [Linux API]     [Monitors]