[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();
> + },
> + }
> + }
> +}
> +
- [PATCH v2 00/11] rust/block: Add minimal block driver bindings, Kevin Wolf, 2025/02/18
- [PATCH v2 02/11] meson: Add rust_block_ss and link tools with it, Kevin Wolf, 2025/02/18
- [PATCH v2 01/11] rust: Build separate qemu_api_tools and qemu_api_system, Kevin Wolf, 2025/02/18
- [PATCH v2 05/11] rust/block: Add empty crate, Kevin Wolf, 2025/02/18
- [PATCH v2 04/11] rust/qemu-api: Add wrappers to run futures in QEMU, Kevin Wolf, 2025/02/18
- Re: [PATCH v2 04/11] rust/qemu-api: Add wrappers to run futures in QEMU,
Zhao Liu <=
- [PATCH v2 06/11] rust/block: Add I/O buffer traits, Kevin Wolf, 2025/02/18
- [PATCH v2 08/11] rust/block: Add driver module, Kevin Wolf, 2025/02/18
- [PATCH v2 09/11] rust/block: Add read support for block drivers, Kevin Wolf, 2025/02/18
- [PATCH v2 03/11] rust: Add some block layer bindings, Kevin Wolf, 2025/02/18
- [PATCH v2 07/11] block: Add bdrv_open_blockdev_ref_file(), Kevin Wolf, 2025/02/18