[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v6 5/7] qemu-coroutine-sleep: introduce qemu_co_slee
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[Qemu-block] [PATCH v6 5/7] qemu-coroutine-sleep: introduce qemu_co_sleep_wake |
Date: |
Thu, 11 Apr 2019 20:27:07 +0300 |
Introduce a function to gracefully wake-up a coroutine, sleeping in
qemu_co_sleep_ns() sleep.
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
---
include/qemu/coroutine.h | 6 ++++++
util/qemu-coroutine-sleep.c | 20 ++++++++++++++++----
2 files changed, 22 insertions(+), 4 deletions(-)
diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h
index 9801e7f5a4..ec765c26f0 100644
--- a/include/qemu/coroutine.h
+++ b/include/qemu/coroutine.h
@@ -278,6 +278,12 @@ void qemu_co_rwlock_unlock(CoRwlock *lock);
*/
void coroutine_fn qemu_co_sleep_ns(QEMUClockType type, int64_t ns);
+/*
+ * Wake a coroutine if it is sleeping by qemu_co_sleep_ns. Timer will be
+ * deleted.
+ */
+void qemu_co_sleep_wake(Coroutine *co);
+
/**
* Yield until a file descriptor becomes readable
*
diff --git a/util/qemu-coroutine-sleep.c b/util/qemu-coroutine-sleep.c
index 4bfdd30cbf..bcc6afca3e 100644
--- a/util/qemu-coroutine-sleep.c
+++ b/util/qemu-coroutine-sleep.c
@@ -17,13 +17,24 @@
#include "qemu/timer.h"
#include "block/aio.h"
+const char *qemu_co_sleep_ns__scheduled = "qemu_co_sleep_ns";
+
+void qemu_co_sleep_wake(Coroutine *co)
+{
+ /* Write of schedule protected by barrier write in aio_co_schedule */
+ const char *scheduled = atomic_cmpxchg(&co->scheduled,
+ qemu_co_sleep_ns__scheduled, NULL);
+
+ if (scheduled == qemu_co_sleep_ns__scheduled) {
+ aio_co_wake(co);
+ }
+}
+
static void co_sleep_cb(void *opaque)
{
Coroutine *co = opaque;
- /* Write of schedule protected by barrier write in aio_co_schedule */
- atomic_set(&co->scheduled, NULL);
- aio_co_wake(co);
+ qemu_co_sleep_wake(co);
}
void coroutine_fn qemu_co_sleep_ns(QEMUClockType type, int64_t ns)
@@ -32,7 +43,8 @@ void coroutine_fn qemu_co_sleep_ns(QEMUClockType type,
int64_t ns)
QEMUTimer *ts;
Coroutine *co = qemu_coroutine_self();
- const char *scheduled = atomic_cmpxchg(&co->scheduled, NULL, __func__);
+ const char *scheduled = atomic_cmpxchg(&co->scheduled, NULL,
+ qemu_co_sleep_ns__scheduled);
if (scheduled) {
fprintf(stderr,
"%s: Co-routine was already scheduled in '%s'\n",
--
2.18.0
- [Qemu-block] [PATCH v6 0/7] NBD reconnect, Vladimir Sementsov-Ogievskiy, 2019/04/11
- [Qemu-block] [PATCH v6 5/7] qemu-coroutine-sleep: introduce qemu_co_sleep_wake,
Vladimir Sementsov-Ogievskiy <=
- [Qemu-block] [PATCH v6 2/7] block/nbd-client: use non-blocking io channel for nbd negotiation, Vladimir Sementsov-Ogievskiy, 2019/04/11
- [Qemu-block] [PATCH v6 7/7] iotests: test nbd reconnect, Vladimir Sementsov-Ogievskiy, 2019/04/11
- [Qemu-block] [PATCH v6 1/7] block/nbd-client: split connection_co start out of nbd_client_connect, Vladimir Sementsov-Ogievskiy, 2019/04/11
- [Qemu-block] [PATCH v6 4/7] block/nbd: add cmdline and qapi parameter reconnect-delay, Vladimir Sementsov-Ogievskiy, 2019/04/11
- [Qemu-block] [PATCH v6 3/7] block/nbd-client: move from quit to state, Vladimir Sementsov-Ogievskiy, 2019/04/11
- [Qemu-block] [PATCH v6 6/7] block/nbd-client: nbd reconnect, Vladimir Sementsov-Ogievskiy, 2019/04/11
- Re: [Qemu-block] [PATCH v6 0/7] NBD reconnect, Vladimir Sementsov-Ogievskiy, 2019/04/30