Browse Source

blockjob: Add block_job_yield()

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>
Fam Zheng 11 years ago
parent
commit
8e09e2013d
2 changed files with 22 additions and 0 deletions
  1. 14 0
      blockjob.c
  2. 8 0
      include/block/blockjob.h

+ 14 - 0
blockjob.c

@@ -206,6 +206,20 @@ void block_job_sleep_ns(BlockJob *job, QEMUClockType type, int64_t ns)
     job->busy = true;
     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 *block_job_query(BlockJob *job)
 {
 {
     BlockJobInfo *info = g_new0(BlockJobInfo, 1);
     BlockJobInfo *info = g_new0(BlockJobInfo, 1);

+ 8 - 0
include/block/blockjob.h

@@ -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);
 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:
  * block_job_completed:
  * @job: The job being completed.
  * @job: The job being completed.