]> xenbits.xensource.com Git - qemu-xen.git/commitdiff
blockjob: Add block_job_yield()
authorFam Zheng <famz@redhat.com>
Tue, 24 Jun 2014 12:26:35 +0000 (20:26 +0800)
committerMichael Roth <mdroth@linux.vnet.ibm.com>
Thu, 7 Aug 2014 08:39:35 +0000 (03:39 -0500)
This will unset busy flag and put coroutine to sleep, can be used to
wait for QMP complete/cancel.

Signed-off-by: Fam Zheng <famz@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
(cherry picked from commit dc71ce45ded4e872e25c2de32d5e7a71842b0985)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
blockjob.c
include/block/blockjob.h

index b3ce14cebd5dc9b28277613c4b7200be010d488e..bf10f82b79bb2709f69467198658e2a6e1dfbde7 100644 (file)
@@ -206,6 +206,20 @@ void block_job_sleep_ns(BlockJob *job, QEMUClockType type, int64_t ns)
     job->busy = true;
 }
 
+void block_job_yield(BlockJob *job)
+{
+    assert(job->busy);
+
+    /* Check cancellation *before* setting busy = false, too!  */
+    if (block_job_is_cancelled(job)) {
+        return;
+    }
+
+    job->busy = false;
+    qemu_coroutine_yield();
+    job->busy = true;
+}
+
 BlockJobInfo *block_job_query(BlockJob *job)
 {
     BlockJobInfo *info = g_new0(BlockJobInfo, 1);
index d76de62a46bb1bca4a30a5c4f4cbc2a220fbd0ae..395be5b6a931fa220fcb3e2c352eb9344b1e9dbb 100644 (file)
@@ -143,6 +143,14 @@ void *block_job_create(const BlockJobDriver *driver, BlockDriverState *bs,
  */
 void block_job_sleep_ns(BlockJob *job, QEMUClockType type, int64_t ns);
 
+/**
+ * block_job_yield:
+ * @job: The job that calls the function.
+ *
+ * Yield the block job coroutine.
+ */
+void block_job_yield(BlockJob *job);
+
 /**
  * block_job_completed:
  * @job: The job being completed.