qemu-rust
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v2 04/11] rust/qemu-api: Add wrappers to run futures in QEMU


From: Zhao Liu
Subject: Re: [PATCH v2 04/11] rust/qemu-api: Add wrappers to run futures in QEMU
Date: Thu, 20 Feb 2025 14:35:56 +0800

> +/// Use QEMU's event loops to run a Rust [`Future`] to completion and return 
> its result.
> +///
> +/// This function must be called in coroutine context. If the future isn't 
> ready yet, it yields.
> +pub fn qemu_co_run_future<F: Future>(future: F) -> F::Output {
> +    let waker = Waker::from(Arc::new(RunFutureWaker {
> +        co: unsafe { bindings::qemu_coroutine_self() },
> +    }));
> +    let mut cx = Context::from_waker(&waker);
> +
> +    let mut pinned_future = std::pin::pin!(future);

pin macro stabilized in v1.68.0, but currently the minimum rustc
supported by QEMU is v1.63.

I found there's a workaround [*], so we can add a temporary pin.rs in
qemu_api until QEMU bumps up rustc to >= v1.68?

[*]: https://github.com/rust-lang/rust/issues/93178#issuecomment-1386177439

> +    loop {
> +        match pinned_future.as_mut().poll(&mut cx) {
> +            Poll::Ready(res) => return res,
> +            Poll::Pending => unsafe {
> +                bindings::qemu_coroutine_yield();
> +            },
> +        }
> +    }
> +}
> +



reply via email to

[Prev in Thread] Current Thread [Next in Thread]