aio / timers: aio_ctx_prepare sets timeout from AioContext timers
Calculate the timeout in aio_ctx_prepare taking into account the timers attached to the AioContext. Alter aio_ctx_check similarly. Signed-off-by: Alex Bligh <alex@alex.org.uk> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
d5541d8680
commit
533a8cf350
13
async.c
13
async.c
@ -150,7 +150,10 @@ aio_ctx_prepare(GSource *source, gint *timeout)
|
|||||||
{
|
{
|
||||||
AioContext *ctx = (AioContext *) source;
|
AioContext *ctx = (AioContext *) source;
|
||||||
QEMUBH *bh;
|
QEMUBH *bh;
|
||||||
|
int deadline;
|
||||||
|
|
||||||
|
/* We assume there is no timeout already supplied */
|
||||||
|
*timeout = -1;
|
||||||
for (bh = ctx->first_bh; bh; bh = bh->next) {
|
for (bh = ctx->first_bh; bh; bh = bh->next) {
|
||||||
if (!bh->deleted && bh->scheduled) {
|
if (!bh->deleted && bh->scheduled) {
|
||||||
if (bh->idle) {
|
if (bh->idle) {
|
||||||
@ -166,6 +169,14 @@ aio_ctx_prepare(GSource *source, gint *timeout)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
deadline = qemu_timeout_ns_to_ms(timerlistgroup_deadline_ns(&ctx->tlg));
|
||||||
|
if (deadline == 0) {
|
||||||
|
*timeout = 0;
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
*timeout = qemu_soonest_timeout(*timeout, deadline);
|
||||||
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -180,7 +191,7 @@ aio_ctx_check(GSource *source)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return aio_pending(ctx);
|
return aio_pending(ctx) || (timerlistgroup_deadline_ns(&ctx->tlg) == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
Loading…
Reference in New Issue
Block a user