From 64423f0e34cc4a7d78c15b345b3b8f58243d8286 Mon Sep 17 00:00:00 2001 From: Vivian Lim Date: Sat, 6 Feb 2021 22:11:59 -0800 Subject: Delete ctr-std to use my fork of the rust repo instead --- ctr-std/src/future.rs | 116 -------------------------------------------------- 1 file changed, 116 deletions(-) delete mode 100644 ctr-std/src/future.rs (limited to 'ctr-std/src/future.rs') diff --git a/ctr-std/src/future.rs b/ctr-std/src/future.rs deleted file mode 100644 index 12ea1ea..0000000 --- a/ctr-std/src/future.rs +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2018 The Rust Project Developers. See the COPYRIGHT -// file at the top-level directory of this distribution and at -// http://rust-lang.org/COPYRIGHT. -// -// Licensed under the Apache License, Version 2.0 or the MIT license -// , at your -// option. This file may not be copied, modified, or distributed -// except according to those terms. - -//! Asynchronous values. - -use core::cell::Cell; -use core::marker::Unpin; -use core::mem::PinMut; -use core::option::Option; -use core::ptr::NonNull; -use core::task::{self, Poll}; -use core::ops::{Drop, Generator, GeneratorState}; - -#[doc(inline)] -pub use core::future::*; - -/// Wrap a future in a generator. -/// -/// This function returns a `GenFuture` underneath, but hides it in `impl Trait` to give -/// better error messages (`impl Future` rather than `GenFuture<[closure.....]>`). -#[unstable(feature = "gen_future", issue = "50547")] -pub fn from_generator>(x: T) -> impl Future { - GenFuture(x) -} - -/// A wrapper around generators used to implement `Future` for `async`/`await` code. -#[unstable(feature = "gen_future", issue = "50547")] -#[derive(Copy, Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] -struct GenFuture>(T); - -// We rely on the fact that async/await futures are immovable in order to create -// self-referential borrows in the underlying generator. -impl> !Unpin for GenFuture {} - -#[unstable(feature = "gen_future", issue = "50547")] -impl> Future for GenFuture { - type Output = T::Return; - fn poll(self: PinMut, cx: &mut task::Context) -> Poll { - set_task_cx(cx, || match unsafe { PinMut::get_mut_unchecked(self).0.resume() } { - GeneratorState::Yielded(()) => Poll::Pending, - GeneratorState::Complete(x) => Poll::Ready(x), - }) - } -} - -thread_local! { - static TLS_CX: Cell>>> = Cell::new(None); -} - -struct SetOnDrop(Option>>); - -impl Drop for SetOnDrop { - fn drop(&mut self) { - TLS_CX.with(|tls_cx| { - tls_cx.set(self.0.take()); - }); - } -} - -#[unstable(feature = "gen_future", issue = "50547")] -/// Sets the thread-local task context used by async/await futures. -pub fn set_task_cx(cx: &mut task::Context, f: F) -> R -where - F: FnOnce() -> R -{ - let old_cx = TLS_CX.with(|tls_cx| { - tls_cx.replace(NonNull::new( - cx - as *mut task::Context - as *mut () - as *mut task::Context<'static> - )) - }); - let _reset_cx = SetOnDrop(old_cx); - f() -} - -#[unstable(feature = "gen_future", issue = "50547")] -/// Retrieves the thread-local task context used by async/await futures. -/// -/// This function acquires exclusive access to the task context. -/// -/// Panics if no task has been set or if the task context has already been -/// retrived by a surrounding call to get_task_cx. -pub fn get_task_cx(f: F) -> R -where - F: FnOnce(&mut task::Context) -> R -{ - let cx_ptr = TLS_CX.with(|tls_cx| { - // Clear the entry so that nested `with_get_cx` calls - // will fail or set their own value. - tls_cx.replace(None) - }); - let _reset_cx = SetOnDrop(cx_ptr); - - let mut cx_ptr = cx_ptr.expect( - "TLS task::Context not set. This is a rustc bug. \ - Please file an issue on https://github.com/rust-lang/rust."); - unsafe { f(cx_ptr.as_mut()) } -} - -#[unstable(feature = "gen_future", issue = "50547")] -/// Polls a future in the current thread-local task context. -pub fn poll_in_task_cx(f: PinMut) -> Poll -where - F: Future -{ - get_task_cx(|cx| f.poll(cx)) -} -- cgit v1.2.3