Am 20.02.2025 um 07:35 hat Zhao Liu geschrieben: > > +/// 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.
Can we check this automatically somehow? I actually seem to remember that I got errors for too new things before. Is the problem here that it's a macro? > 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 I don't think we'll need this anywhere else, so I can just open-code what the macro does: // TODO Use std::pin::pin! when MSRV is updated to at least 1.68.0 // SAFETY: `future` is not used any more after this and dropped at the end of the function. let mut pinned_future = unsafe { std::pin::Pin::new_unchecked(&mut future)}; Kevin