4
4
futures_api,
5
5
) ]
6
6
7
- use std:: { future:: Future , pin:: Pin , task:: Poll } ;
7
+ use std:: { future:: Future , pin:: Pin , task:: Poll , ptr} ;
8
+ use std:: task:: { Waker , RawWaker , RawWakerVTable } ;
8
9
9
10
// See if we can run a basic `async fn`
10
11
pub async fn foo ( x : & u32 , y : u32 ) -> u32 {
@@ -17,18 +18,23 @@ pub async fn foo(x: &u32, y: u32) -> u32 {
17
18
* x + y + * a
18
19
}
19
20
20
- fn main ( ) {
21
- use std:: { sync:: Arc , task:: { Wake , local_waker} } ;
21
+ fn raw_waker_clone ( _this : * const ( ) ) -> RawWaker {
22
+ panic ! ( "unimplemented" ) ;
23
+ }
24
+ fn raw_waker_wake ( _this : * const ( ) ) {
25
+ panic ! ( "unimplemented" ) ;
26
+ }
27
+ fn raw_waker_drop ( _this : * const ( ) ) { }
22
28
23
- struct NoWake ;
24
- impl Wake for NoWake {
25
- fn wake ( _arc_self : & Arc < Self > ) {
26
- panic ! ( ) ;
27
- }
28
- }
29
+ static RAW_WAKER : RawWakerVTable = RawWakerVTable {
30
+ clone : raw_waker_clone,
31
+ wake : raw_waker_wake,
32
+ drop : raw_waker_drop,
33
+ } ;
29
34
30
- let lw = unsafe { local_waker ( Arc :: new ( NoWake ) ) } ;
35
+ fn main ( ) {
31
36
let x = 5 ;
32
37
let mut fut = foo ( & x, 7 ) ;
33
- assert_eq ! ( unsafe { Pin :: new_unchecked( & mut fut) } . poll( & lw) , Poll :: Ready ( 31 ) ) ;
38
+ let waker = unsafe { Waker :: new_unchecked ( RawWaker :: new ( ptr:: null ( ) , & RAW_WAKER ) ) } ;
39
+ assert_eq ! ( unsafe { Pin :: new_unchecked( & mut fut) } . poll( & waker) , Poll :: Ready ( 31 ) ) ;
34
40
}
0 commit comments