forked from rust-lang/rust
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Auto merge of rust-lang#70330 - Centril:rollup-ts0clvx, r=Centril
Rollup of 9 pull requests Successful merges: - rust-lang#68700 (Add Wake trait for safe construction of Wakers.) - rust-lang#69494 (Stabilize --crate-version option in rustdoc) - rust-lang#70080 (rustc_mir: remove extra space when pretty-printing MIR.) - rust-lang#70195 (Add test for issue rust-lang#53275) - rust-lang#70199 (Revised span-to-lines conversion to produce an empty vec on DUMMY_SP.) - rust-lang#70299 (add err_machine_stop macro) - rust-lang#70300 (Reword unused variable warning) - rust-lang#70315 (Rename remaining occurences of Void to Opaque.) - rust-lang#70318 (Split long derive lists into two derive attributes.) Failed merges: r? @ghost
- Loading branch information
Showing
56 changed files
with
296 additions
and
586 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,87 @@ | ||
#![unstable(feature = "wake_trait", issue = "69912")] | ||
//! Types and Traits for working with asynchronous tasks. | ||
use core::mem::{self, ManuallyDrop}; | ||
use core::task::{RawWaker, RawWakerVTable, Waker}; | ||
|
||
use crate::sync::Arc; | ||
|
||
/// The implementation of waking a task on an executor. | ||
/// | ||
/// This trait can be used to create a [`Waker`]. An executor can define an | ||
/// implementation of this trait, and use that to construct a Waker to pass | ||
/// to the tasks that are executed on that executor. | ||
/// | ||
/// This trait is a memory-safe and ergonomic alternative to constructing a | ||
/// [`RawWaker`]. It supports the common executor design in which the data | ||
/// used to wake up a task is stored in an [`Arc`]. Some executors (especially | ||
/// those for embedded systems) cannot use this API, which is why [`RawWaker`] | ||
/// exists as an alternative for those systems. | ||
#[unstable(feature = "wake_trait", issue = "69912")] | ||
pub trait Wake { | ||
/// Wake this task. | ||
#[unstable(feature = "wake_trait", issue = "69912")] | ||
fn wake(self: Arc<Self>); | ||
|
||
/// Wake this task without consuming the waker. | ||
/// | ||
/// If an executor supports a cheaper way to wake without consuming the | ||
/// waker, it should override this method. By default, it clones the | ||
/// [`Arc`] and calls `wake` on the clone. | ||
#[unstable(feature = "wake_trait", issue = "69912")] | ||
fn wake_by_ref(self: &Arc<Self>) { | ||
self.clone().wake(); | ||
} | ||
} | ||
|
||
#[unstable(feature = "wake_trait", issue = "69912")] | ||
impl<W: Wake + Send + Sync + 'static> From<Arc<W>> for Waker { | ||
fn from(waker: Arc<W>) -> Waker { | ||
// SAFETY: This is safe because raw_waker safely constructs | ||
// a RawWaker from Arc<W>. | ||
unsafe { Waker::from_raw(raw_waker(waker)) } | ||
} | ||
} | ||
|
||
#[unstable(feature = "wake_trait", issue = "69912")] | ||
impl<W: Wake + Send + Sync + 'static> From<Arc<W>> for RawWaker { | ||
fn from(waker: Arc<W>) -> RawWaker { | ||
raw_waker(waker) | ||
} | ||
} | ||
|
||
// NB: This private function for constructing a RawWaker is used, rather than | ||
// inlining this into the `From<Arc<W>> for RawWaker` impl, to ensure that | ||
// the safety of `From<Arc<W>> for Waker` does not depend on the correct | ||
// trait dispatch - instead both impls call this function directly and | ||
// explicitly. | ||
#[inline(always)] | ||
fn raw_waker<W: Wake + Send + Sync + 'static>(waker: Arc<W>) -> RawWaker { | ||
// Increment the reference count of the arc to clone it. | ||
unsafe fn clone_waker<W: Wake + Send + Sync + 'static>(waker: *const ()) -> RawWaker { | ||
let waker: Arc<W> = Arc::from_raw(waker as *const W); | ||
mem::forget(Arc::clone(&waker)); | ||
raw_waker(waker) | ||
} | ||
|
||
// Wake by value, moving the Arc into the Wake::wake function | ||
unsafe fn wake<W: Wake + Send + Sync + 'static>(waker: *const ()) { | ||
let waker: Arc<W> = Arc::from_raw(waker as *const W); | ||
<W as Wake>::wake(waker); | ||
} | ||
|
||
// Wake by reference, wrap the waker in ManuallyDrop to avoid dropping it | ||
unsafe fn wake_by_ref<W: Wake + Send + Sync + 'static>(waker: *const ()) { | ||
let waker: ManuallyDrop<Arc<W>> = ManuallyDrop::new(Arc::from_raw(waker as *const W)); | ||
<W as Wake>::wake_by_ref(&waker); | ||
} | ||
|
||
// Decrement the reference count of the Arc on drop | ||
unsafe fn drop_waker<W: Wake + Send + Sync + 'static>(waker: *const ()) { | ||
mem::drop(Arc::from_raw(waker as *const W)); | ||
} | ||
|
||
RawWaker::new( | ||
Arc::into_raw(waker) as *const (), | ||
&RawWakerVTable::new(clone_waker::<W>, wake::<W>, wake_by_ref::<W>, drop_waker::<W>), | ||
) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.