diff mbox

[RFC,v2,09/15] Add a synchronous wrapper bdrv_sync_rwco

Message ID 1376070245-22557-9-git-send-email-charlie@ctshepherd.com
State New
Headers show

Commit Message

Charlie Shepherd Aug. 9, 2013, 5:43 p.m. UTC
A number of functions in block.c pass an RwCo struct to a coroutine entry point in order to
synchronise an asynchronous function. This patch factors this pattern out into a function.

Signed-off-by: Charlie Shepherd <charlie@ctshepherd.com>
---
 block.c | 37 +++++++++++++++++--------------------
 1 file changed, 17 insertions(+), 20 deletions(-)

Comments

Stefan Hajnoczi Aug. 29, 2013, 3:32 p.m. UTC | #1
On Fri, Aug 09, 2013 at 07:43:59PM +0200, Charlie Shepherd wrote:
> A number of functions in block.c pass an RwCo struct to a coroutine entry point in order to
> synchronise an asynchronous function. This patch factors this pattern out into a function.
> 
> Signed-off-by: Charlie Shepherd <charlie@ctshepherd.com>
> ---
>  block.c | 37 +++++++++++++++++--------------------
>  1 file changed, 17 insertions(+), 20 deletions(-)

Nice :)
diff mbox

Patch

diff --git a/block.c b/block.c
index 51a6649..25edb44 100644
--- a/block.c
+++ b/block.c
@@ -2171,6 +2171,17 @@  typedef struct RwCo {
     BdrvRequestFlags flags;
 } RwCo;
 
+static int bdrv_sync_rwco(void coroutine_fn (*co_fn)(void *), RwCo *rwco)
+{
+    Coroutine *co;
+    co = qemu_coroutine_create(co_fn);
+    qemu_coroutine_enter(co, rwco);
+    while (rwco->ret == NOT_DONE) {
+        qemu_aio_wait();
+    }
+    return rwco->ret;
+}
+
 static void coroutine_fn bdrv_rw_co_entry(void *opaque)
 {
     RwCo *rwco = opaque;
@@ -2219,14 +2230,10 @@  static int bdrv_rwv_co(BlockDriverState *bs, int64_t sector_num,
     if (qemu_in_coroutine()) {
         /* Fast-path if already in coroutine context */
         bdrv_rw_co_entry(&rwco);
+        return rwco.ret;
     } else {
-        co = qemu_coroutine_create(bdrv_rw_co_entry);
-        qemu_coroutine_enter(co, &rwco);
-        while (rwco.ret == NOT_DONE) {
-            qemu_aio_wait();
-        }
+        return bdrv_sync_rwco(bdrv_rw_co_entry, &rwco);
     }
-    return rwco.ret;
 }
 
 /*
@@ -4144,15 +4151,10 @@  int bdrv_flush(BlockDriverState *bs)
     if (qemu_in_coroutine()) {
         /* Fast-path if already in coroutine context */
         bdrv_flush_co_entry(&rwco);
+        return rwco.ret;
     } else {
-        co = qemu_coroutine_create(bdrv_flush_co_entry);
-        qemu_coroutine_enter(co, &rwco);
-        while (rwco.ret == NOT_DONE) {
-            qemu_aio_wait();
-        }
+        return bdrv_sync_rwco(bdrv_flush_co_entry, &rwco);
     }
-
-    return rwco.ret;
 }
 
 static void coroutine_fn bdrv_discard_co_entry(void *opaque)
@@ -4216,15 +4218,10 @@  int bdrv_discard(BlockDriverState *bs, int64_t sector_num, int nb_sectors)
     if (qemu_in_coroutine()) {
         /* Fast-path if already in coroutine context */
         bdrv_discard_co_entry(&rwco);
+        return rwco.ret;
     } else {
-        co = qemu_coroutine_create(bdrv_discard_co_entry);
-        qemu_coroutine_enter(co, &rwco);
-        while (rwco.ret == NOT_DONE) {
-            qemu_aio_wait();
-        }
+        return bdrv_sync_rwco(bdrv_discard_co_entry, &rwco);
     }
-
-    return rwco.ret;
 }
 
 /**************************************************************/