Skip to content

Instantly share code, notes, and snippets.

@rust-play
Created October 18, 2019 00:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save rust-play/3b724b99302c4e8a869f8e0f820887dd to your computer and use it in GitHub Desktop.
Save rust-play/3b724b99302c4e8a869f8e0f820887dd to your computer and use it in GitHub Desktop.
Code shared from the Rust Playground
#![forbid(unsafe_code)]
use std::future::Future;
use std::pin::Pin;
use std::task::{Context, Poll};
/// Poll a future once.
struct PollOnce<'a, F>(Option<&'a mut F>);
impl<'a, F> PollOnce<'a, F> {
pub fn new(future: &'a mut F) -> Self {
Self(Some(future))
}
}
impl<'a, F: Future + Unpin> Future for PollOnce<'a, F> {
type Output = Option<F::Output>;
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {
if let Some(future) = self.0.take() {
if let Poll::Ready(value) = Pin::new(future).poll(cx) {
return Poll::Ready(Some(value));
}
}
Poll::Ready(None)
}
}
/// An operation that borrows a slice and modifies it in another thread or via the OS.
async fn os_or_thread_operation(_buf: &mut [u8]) {}
pub async fn leak_memory() {
let mut buf = vec![0_u8; 10];
// Create a future that borrows a buffer from this future's stack.
let mut future = Box::pin(os_or_thread_operation(&mut buf));
// Start work:
PollOnce::new(&mut future).await;
// Never drop future:
std::mem::forget(future);
// Free the buffer that the `os_or_thread_operation` future is using:
drop(buf);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment