Patchwork [RFC,v0,05/10] qemu-coroutine: Add simple work queue support

login
register
mail settings
Submitter Peter A. G. Crosthwaite
Date Sept. 17, 2012, 9:02 a.m.
Message ID <08c14e2ef3bc304000fc58619f1b60d4d813c00d.1347871922.git.peter.crosthwaite@petalogix.com>
Download mbox | patch
Permalink /patch/184346/
State New
Headers show

Comments

Peter A. G. Crosthwaite - Sept. 17, 2012, 9:02 a.m.
Add a function co_queue_enter_next() which will immediately transfer
control to the coroutine at the head of a co queue. This can be used for
implementing simple work queues where the manager of a co-queue only
needs to enter queued routines one at a time.

Signed-off-by: Peter A. G. Crosthwaite <peter.crosthwaite@petalogix.com>
---
 qemu-coroutine-lock.c |   13 +++++++++++++
 qemu-coroutine.h      |    9 +++++++++
 2 files changed, 22 insertions(+), 0 deletions(-)

Patch

diff --git a/qemu-coroutine-lock.c b/qemu-coroutine-lock.c
index 26ad76b..6e343b1 100644
--- a/qemu-coroutine-lock.c
+++ b/qemu-coroutine-lock.c
@@ -91,6 +91,19 @@  void qemu_co_queue_restart_all(CoQueue *queue)
     }
 }
 
+bool qemu_co_queue_enter_next(CoQueue *queue)
+{
+    Coroutine *next;
+
+    next = QTAILQ_FIRST(&queue->entries);
+    if (next) {
+        QTAILQ_REMOVE(&queue->entries, next, co_queue_next);
+        qemu_coroutine_enter(next, NULL);
+    }
+
+    return (next != NULL);
+}
+
 bool qemu_co_queue_empty(CoQueue *queue)
 {
     return (QTAILQ_FIRST(&queue->entries) == NULL);
diff --git a/qemu-coroutine.h b/qemu-coroutine.h
index 34c15d4..d63b103 100644
--- a/qemu-coroutine.h
+++ b/qemu-coroutine.h
@@ -137,6 +137,15 @@  bool qemu_co_queue_next(CoQueue *queue);
 void qemu_co_queue_restart_all(CoQueue *queue);
 
 /**
+ * Transfers control to the next coroutine in the CoQueue and removes it from
+ * the queue.
+ *
+ * Returns true once after control transfers back to caller, or false
+ * immediately if the queue is empty.
+ */
+bool qemu_co_queue_enter_next(CoQueue *queue);
+
+/**
  * Checks if the CoQueue is empty.
  */
 bool qemu_co_queue_empty(CoQueue *queue);