Force yield_now in Task::future and stream
This commit is contained in:
parent
d5608162de
commit
05c80aa312
1 changed files with 38 additions and 2 deletions
|
|
@ -8,7 +8,9 @@ use crate::futures::futures::stream::{self, Stream, StreamExt};
|
||||||
use crate::futures::{BoxStream, MaybeSend, boxed_stream};
|
use crate::futures::{BoxStream, MaybeSend, boxed_stream};
|
||||||
|
|
||||||
use std::convert::Infallible;
|
use std::convert::Infallible;
|
||||||
|
use std::pin::Pin;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
use std::task;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
|
|
||||||
#[cfg(feature = "sipper")]
|
#[cfg(feature = "sipper")]
|
||||||
|
|
@ -257,7 +259,10 @@ impl<T> Task<T> {
|
||||||
where
|
where
|
||||||
T: 'static,
|
T: 'static,
|
||||||
{
|
{
|
||||||
Self::stream(stream::once(future))
|
Self::stream(stream::once(async {
|
||||||
|
yield_now().await;
|
||||||
|
future.await
|
||||||
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Creates a new [`Task`] that runs the given [`Stream`] and produces
|
/// Creates a new [`Task`] that runs the given [`Stream`] and produces
|
||||||
|
|
@ -267,7 +272,11 @@ impl<T> Task<T> {
|
||||||
T: 'static,
|
T: 'static,
|
||||||
{
|
{
|
||||||
Self {
|
Self {
|
||||||
stream: Some(boxed_stream(stream.map(Action::Output))),
|
stream: Some(boxed_stream(
|
||||||
|
stream::once(yield_now())
|
||||||
|
.filter_map(|_| async { None })
|
||||||
|
.chain(stream.map(Action::Output)),
|
||||||
|
)),
|
||||||
units: 1,
|
units: 1,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -511,3 +520,30 @@ where
|
||||||
stream::once(error_receiver).filter_map(async |result| result.ok()),
|
stream::once(error_receiver).filter_map(async |result| result.ok()),
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async fn yield_now() {
|
||||||
|
struct YieldNow {
|
||||||
|
yielded: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Future for YieldNow {
|
||||||
|
type Output = ();
|
||||||
|
|
||||||
|
fn poll(
|
||||||
|
mut self: Pin<&mut Self>,
|
||||||
|
cx: &mut task::Context<'_>,
|
||||||
|
) -> task::Poll<()> {
|
||||||
|
if self.yielded {
|
||||||
|
return task::Poll::Ready(());
|
||||||
|
}
|
||||||
|
|
||||||
|
self.yielded = true;
|
||||||
|
|
||||||
|
cx.waker().wake_by_ref();
|
||||||
|
|
||||||
|
task::Poll::Pending
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
YieldNow { yielded: false }.await;
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue