diff --git a/block-raw.c b/block-raw.c index 14f4bd5b3cb31f4efa2986dd65fa94d66a7a9581..adb3d39add449ba793346756a27d6488b0c79535 100644 --- a/block-raw.c +++ b/block-raw.c @@ -308,6 +308,11 @@ void qemu_aio_wait(void) { sigset_t set; int nb_sigs; + +#ifndef QEMU_TOOL + if (qemu_bh_poll()) + return; +#endif sigemptyset(&set); sigaddset(&set, aio_sig_num); sigwait(&set, &nb_sigs); diff --git a/vl.c b/vl.c index 6daed966b1abd4460c9b29cba48bc62af5a053be..0504c6f199cc80abb1a72f45121fc6a811c8a683 100644 --- a/vl.c +++ b/vl.c @@ -5200,19 +5200,23 @@ QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque) return bh; } -void qemu_bh_poll(void) +int qemu_bh_poll(void) { QEMUBH *bh, **pbh; + int ret; + ret = 0; for(;;) { pbh = &first_bh; bh = *pbh; if (!bh) break; + ret = 1; *pbh = bh->next; bh->scheduled = 0; bh->cb(bh->opaque); } + return ret; } void qemu_bh_schedule(QEMUBH *bh) diff --git a/vl.h b/vl.h index f71742463164acd2f64ef63eb86e6da915d0129b..ce52fb82605941c4e2c471f053374bfab8c71a9d 100644 --- a/vl.h +++ b/vl.h @@ -495,7 +495,7 @@ QEMUBH *qemu_bh_new(QEMUBHFunc *cb, void *opaque); void qemu_bh_schedule(QEMUBH *bh); void qemu_bh_cancel(QEMUBH *bh); void qemu_bh_delete(QEMUBH *bh); -void qemu_bh_poll(void); +int qemu_bh_poll(void); /* block.c */ typedef struct BlockDriverState BlockDriverState;