aboutsummaryrefslogtreecommitdiff
path: root/util
diff options
context:
space:
mode:
authorKevin Wolf <kwolf@redhat.com>2016-11-07 16:34:35 +0100
committerKevin Wolf <kwolf@redhat.com>2017-01-09 13:30:52 +0100
commit536fca7f7ea4913f71df7f420953e97619be74e1 (patch)
treea23646c39583a7a43ced78c5714b5103f5aa7fce /util
parent4baaa8c3d891b57036fd2a7c6a890737793fe3a0 (diff)
downloadqemu-536fca7f7ea4913f71df7f420953e97619be74e1.zip
qemu-536fca7f7ea4913f71df7f420953e97619be74e1.tar.gz
qemu-536fca7f7ea4913f71df7f420953e97619be74e1.tar.bz2
coroutine: Introduce qemu_coroutine_enter_if_inactive()
In the context of asynchronous work, if we have a worker coroutine that didn't yield, the parent coroutine cannot be reentered because it hasn't yielded yet. In this case we don't even have to reenter the parent because it will see that the work is already done and won't even yield. Signed-off-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Reviewed-by: Alberto Garcia <berto@igalia.com>
Diffstat (limited to 'util')
-rw-r--r--util/qemu-coroutine.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/util/qemu-coroutine.c b/util/qemu-coroutine.c
index 737bffa..a5d2f6c 100644
--- a/util/qemu-coroutine.c
+++ b/util/qemu-coroutine.c
@@ -131,6 +131,13 @@ void qemu_coroutine_enter(Coroutine *co)
}
}
+void qemu_coroutine_enter_if_inactive(Coroutine *co)
+{
+ if (!qemu_coroutine_entered(co)) {
+ qemu_coroutine_enter(co);
+ }
+}
+
void coroutine_fn qemu_coroutine_yield(void)
{
Coroutine *self = qemu_coroutine_self();