aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2006-08-06 09:51:25 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2006-08-06 09:51:25 +0000
commit6eb5733a3cad93b00043d48fa22b9df7d1f5ab33 (patch)
tree35cf5afe09e2954bd11d3288b4d36071299747b5
parent15e6690aca348a7dc8772b8f1197cf13c8764335 (diff)
downloadqemu-6eb5733a3cad93b00043d48fa22b9df7d1f5ab33.zip
qemu-6eb5733a3cad93b00043d48fa22b9df7d1f5ab33.tar.gz
qemu-6eb5733a3cad93b00043d48fa22b9df7d1f5ab33.tar.bz2
fixed blocking io emulation
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2090 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--block-raw.c5
-rw-r--r--vl.c6
-rw-r--r--vl.h2
3 files changed, 11 insertions, 2 deletions
diff --git a/block-raw.c b/block-raw.c
index 14f4bd5..adb3d39 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 6daed96..0504c6f 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 f717424..ce52fb8 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;