File tree 3 files changed +48
-0
lines changed
3 files changed +48
-0
lines changed Original file line number Diff line number Diff line change @@ -43,6 +43,22 @@ impl RawWaker {
43
43
pub const fn new ( data : * const ( ) , vtable : & ' static RawWakerVTable ) -> RawWaker {
44
44
RawWaker { data, vtable }
45
45
}
46
+
47
+ /// Get the `data` pointer used to create this `RawWaker`.
48
+ #[ inline]
49
+ #[ must_use]
50
+ #[ unstable( feature = "waker_getters" , issue = "87021" ) ]
51
+ pub fn data ( & self ) -> * const ( ) {
52
+ self . data
53
+ }
54
+
55
+ /// Get the `vtable` pointer used to create this `RawWaker`.
56
+ #[ inline]
57
+ #[ must_use]
58
+ #[ unstable( feature = "waker_getters" , issue = "87021" ) ]
59
+ pub fn vtable ( & self ) -> & ' static RawWakerVTable {
60
+ self . vtable
61
+ }
46
62
}
47
63
48
64
/// A virtual function pointer table (vtable) that specifies the behavior
@@ -260,6 +276,14 @@ impl Waker {
260
276
pub unsafe fn from_raw ( waker : RawWaker ) -> Waker {
261
277
Waker { waker }
262
278
}
279
+
280
+ /// Get a reference to the underlying [`RawWaker`].
281
+ #[ inline]
282
+ #[ must_use]
283
+ #[ unstable( feature = "waker_getters" , issue = "87021" ) ]
284
+ pub fn as_raw ( & self ) -> & RawWaker {
285
+ & self . waker
286
+ }
263
287
}
264
288
265
289
#[ stable( feature = "futures_api" , since = "1.36.0" ) ]
Original file line number Diff line number Diff line change 81
81
#![ feature( unzip_option) ]
82
82
#![ feature( const_array_from_ref) ]
83
83
#![ feature( const_slice_from_ref) ]
84
+ #![ feature( waker_getters) ]
84
85
#![ deny( unsafe_op_in_unsafe_fn) ]
85
86
86
87
extern crate test;
@@ -121,3 +122,4 @@ mod task;
121
122
mod time;
122
123
mod tuple;
123
124
mod unicode;
125
+ mod waker;
Original file line number Diff line number Diff line change
1
+ use std:: ptr;
2
+ use std:: task:: { RawWaker , RawWakerVTable , Waker } ;
3
+
4
+ #[ test]
5
+ fn test_waker_getters ( ) {
6
+ let raw_waker = RawWaker :: new ( 42usize as * mut ( ) , & WAKER_VTABLE ) ;
7
+ assert_eq ! ( raw_waker. data( ) as usize , 42 ) ;
8
+ assert ! ( ptr:: eq( raw_waker. vtable( ) , & WAKER_VTABLE ) ) ;
9
+
10
+ let waker = unsafe { Waker :: from_raw ( raw_waker) } ;
11
+ let waker2 = waker. clone ( ) ;
12
+ let raw_waker2 = waker2. as_raw ( ) ;
13
+ assert_eq ! ( raw_waker2. data( ) as usize , 43 ) ;
14
+ assert ! ( ptr:: eq( raw_waker2. vtable( ) , & WAKER_VTABLE ) ) ;
15
+ }
16
+
17
+ static WAKER_VTABLE : RawWakerVTable = RawWakerVTable :: new (
18
+ |data| RawWaker :: new ( ( data as usize + 1 ) as * mut ( ) , & WAKER_VTABLE ) ,
19
+ |_| { } ,
20
+ |_| { } ,
21
+ |_| { } ,
22
+ ) ;
You can’t perform that action at this time.
0 commit comments