On Wed, 23 Oct 2019 at 03:04, Eric Blake <address@hidden> wrote:
From: Vladimir Sementsov-Ogievskiy <address@hidden>
Introduce a function to gracefully wake a coroutine sleeping in
qemu_co_sleep_ns().
Signed-off-by: Vladimir Sementsov-Ogievskiy <address@hidden>
Reviewed-by: Kevin Wolf <address@hidden>
Reviewed-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Eric Blake <address@hidden>
Hi; Coverity reports an issue in this patch (CID 1406474):
-void coroutine_fn qemu_co_sleep_ns(QEMUClockType type, int64_t ns)
+void coroutine_fn qemu_co_sleep_ns_wakeable(QEMUClockType type, int64_t ns,
+ QemuCoSleepState **sleep_state)
{
AioContext *ctx = qemu_get_current_aio_context();
- QEMUTimer *ts;
- Coroutine *co = qemu_coroutine_self();
+ QemuCoSleepState state = {
+ .co = qemu_coroutine_self(),
+ .ts = aio_timer_new(ctx, type, SCALE_NS, co_sleep_cb, &state),
+ .user_state_pointer = sleep_state,
+ };
Here 'state' is a variable on the stack...
- const char *scheduled = atomic_cmpxchg(&co->scheduled, NULL, __func__);
+ const char *scheduled = atomic_cmpxchg(&state.co->scheduled, NULL,
+ qemu_co_sleep_ns__scheduled);
if (scheduled) {
fprintf(stderr,
"%s: Co-routine was already scheduled in '%s'\n",
__func__, scheduled);
abort();
}
- ts = aio_timer_new(ctx, type, SCALE_NS, co_sleep_cb, co);
- timer_mod(ts, qemu_clock_get_ns(type) + ns);
+
+ if (sleep_state) {
+ *sleep_state = &state;
...here we save a pointer to it into *sleep_state which was
passed to us by the caller...
+ }
+ timer_mod(state.ts, qemu_clock_get_ns(type) + ns);
qemu_coroutine_yield();
- timer_del(ts);
- timer_free(ts);
+ timer_free(state.ts);
...and here we return from this function, which means 'state'
is no longer in valid memory, but the caller has still been
given a pointer to it.
}
Is this just Coverity getting confused by our coroutine code?
(I certainly find it confusing...)