Skip to content

Commit

Permalink
Implement data and vtable getters for RawWaker
Browse files Browse the repository at this point in the history
  • Loading branch information
oxalica committed Dec 16, 2021
1 parent 58457bb commit bae0da8
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 0 deletions.
24 changes: 24 additions & 0 deletions library/core/src/task/wake.rs
Expand Up @@ -43,6 +43,22 @@ impl RawWaker {
pub const fn new(data: *const (), vtable: &'static RawWakerVTable) -> RawWaker {
RawWaker { data, vtable }
}

/// Get the `data` pointer used to create this `RawWaker`.
#[inline]
#[must_use]
#[unstable(feature = "waker_getters", issue = "87021")]
pub fn data(&self) -> *const () {
self.data
}

/// Get the `vtable` pointer used to create this `RawWaker`.
#[inline]
#[must_use]
#[unstable(feature = "waker_getters", issue = "87021")]
pub fn vtable(&self) -> &'static RawWakerVTable {
self.vtable
}
}

/// A virtual function pointer table (vtable) that specifies the behavior
Expand Down Expand Up @@ -260,6 +276,14 @@ impl Waker {
pub unsafe fn from_raw(waker: RawWaker) -> Waker {
Waker { waker }
}

/// Get a reference to the underlying [`RawWaker`].
#[inline]
#[must_use]
#[unstable(feature = "waker_getters", issue = "87021")]
pub fn as_raw(&self) -> &RawWaker {
&self.waker
}
}

#[stable(feature = "futures_api", since = "1.36.0")]
Expand Down
2 changes: 2 additions & 0 deletions library/core/tests/lib.rs
Expand Up @@ -81,6 +81,7 @@
#![feature(unzip_option)]
#![feature(const_array_from_ref)]
#![feature(const_slice_from_ref)]
#![feature(waker_getters)]
#![deny(unsafe_op_in_unsafe_fn)]

extern crate test;
Expand Down Expand Up @@ -121,3 +122,4 @@ mod task;
mod time;
mod tuple;
mod unicode;
mod waker;
22 changes: 22 additions & 0 deletions library/core/tests/waker.rs
@@ -0,0 +1,22 @@
use std::ptr;
use std::task::{RawWaker, RawWakerVTable, Waker};

#[test]
fn test_waker_getters() {
let raw_waker = RawWaker::new(42usize as *mut (), &WAKER_VTABLE);
assert_eq!(raw_waker.data() as usize, 42);
assert!(ptr::eq(raw_waker.vtable(), &WAKER_VTABLE));

let waker = unsafe { Waker::from_raw(raw_waker) };
let waker2 = waker.clone();
let raw_waker2 = waker2.as_raw();
assert_eq!(raw_waker2.data() as usize, 43);
assert!(ptr::eq(raw_waker2.vtable(), &WAKER_VTABLE));
}

static WAKER_VTABLE: RawWakerVTable = RawWakerVTable::new(
|data| RawWaker::new((data as usize + 1) as *mut (), &WAKER_VTABLE),
|_| {},
|_| {},
|_| {},
);

0 comments on commit bae0da8

Please sign in to comment.