From e9e6295b28b331762e67d466f77ba07a349edbbc Mon Sep 17 00:00:00 2001 From: Zhi Yong Wu Date: Thu, 3 Nov 2011 16:57:26 +0800 Subject: [PATCH] CoQueue: introduce qemu_co_queue_wait_insert_head Signed-off-by: Zhi Yong Wu Signed-off-by: Stefan Hajnoczi Signed-off-by: Kevin Wolf --- qemu-coroutine-lock.c | 8 ++++++++ qemu-coroutine.h | 6 ++++++ 2 files changed, 14 insertions(+) diff --git a/qemu-coroutine-lock.c b/qemu-coroutine-lock.c index 6b58160058..9549c075ee 100644 --- a/qemu-coroutine-lock.c +++ b/qemu-coroutine-lock.c @@ -61,6 +61,14 @@ void coroutine_fn qemu_co_queue_wait(CoQueue *queue) assert(qemu_in_coroutine()); } +void coroutine_fn qemu_co_queue_wait_insert_head(CoQueue *queue) +{ + Coroutine *self = qemu_coroutine_self(); + QTAILQ_INSERT_HEAD(&queue->entries, self, co_queue_next); + qemu_coroutine_yield(); + assert(qemu_in_coroutine()); +} + bool qemu_co_queue_next(CoQueue *queue) { Coroutine *next; diff --git a/qemu-coroutine.h b/qemu-coroutine.h index b8fc4f4332..8a2e5d2a10 100644 --- a/qemu-coroutine.h +++ b/qemu-coroutine.h @@ -117,6 +117,12 @@ void qemu_co_queue_init(CoQueue *queue); */ void coroutine_fn qemu_co_queue_wait(CoQueue *queue); +/** + * Adds the current coroutine to the head of the CoQueue and transfers control to the + * caller of the coroutine. + */ +void coroutine_fn qemu_co_queue_wait_insert_head(CoQueue *queue); + /** * Restarts the next coroutine in the CoQueue and removes it from the queue. *