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. *