forked from mirror/async-std
		
	* Cleanup: replace cfg-if with our macros * Prefix macros with cfg_ * Remove #[macro_export] from internal macros
		
			
				
	
	
		
			53 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			53 lines
		
	
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use crate::future::Future;
 | |
| use crate::task::{Context, Poll};
 | |
| 
 | |
| use std::pin::Pin;
 | |
| 
 | |
| /// 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:
 | |
| ///
 | |
| /// ```
 | |
| /// # fn main() { async_std::task::block_on(async {
 | |
| /// #
 | |
| /// use async_std::task;
 | |
| ///
 | |
| /// task::yield_now().await;
 | |
| /// #
 | |
| /// # }) }
 | |
| /// ```
 | |
| #[cfg(feature = "unstable")]
 | |
| #[cfg_attr(feature = "docs", doc(cfg(unstable)))]
 | |
| #[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(())
 | |
|         }
 | |
|     }
 | |
| }
 |