123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- use std::cell::Cell;
- use crate::innerlude::*;
- // create a cell with a "none" value
- #[inline]
- pub fn empty_cell() -> Cell<Option<ElementId>> {
- Cell::new(None)
- }
- pub fn type_name_of<T>(_: T) -> &'static str {
- std::any::type_name::<T>()
- }
- use std::future::Future;
- use std::pin::Pin;
- use std::task::{Context, Poll};
- // use crate::task::{Context, Poll};
- /// Cooperatively gives up a timeslice to the task scheduler.
- ///
- /// Calling this function will move the currently executing future to the back
- /// of the execution queue, making room for other futures to execute. This is
- /// especially useful after running CPU-intensive operations inside a future.
- ///
- /// See also [`task::spawn_blocking`].
- ///
- /// [`task::spawn_blocking`]: fn.spawn_blocking.html
- ///
- /// # Examples
- ///
- /// Basic usage:
- ///
- /// ```
- /// # async_std::task::block_on(async {
- /// #
- /// use async_std::task;
- ///
- /// task::yield_now().await;
- /// #
- /// # })
- /// ```
- #[inline]
- pub async fn yield_now() {
- YieldNow(false).await
- }
- struct YieldNow(bool);
- impl Future for YieldNow {
- type Output = ();
- // The futures executor is implemented as a FIFO queue, so all this future
- // does is re-schedule the future back to the end of the queue, giving room
- // for other futures to progress.
- fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
- if !self.0 {
- self.0 = true;
- cx.waker().wake_by_ref();
- Poll::Pending
- } else {
- Poll::Ready(())
- }
- }
- }
|