2 // aux-build:arc_wake.rs
8 use std
::future
::Future
;
11 atomic
::{self, AtomicUsize}
,
13 use std
::task
::{Context, Poll}
;
14 use arc_wake
::ArcWake
;
20 impl ArcWake
for Counter
{
21 fn wake(self: Arc
<Self>) {
22 Self::wake_by_ref(&self)
24 fn wake_by_ref(arc_self
: &Arc
<Self>) {
25 arc_self
.wakes
.fetch_add(1, atomic
::Ordering
::SeqCst
);
29 struct WakeOnceThenComplete(bool
, u8);
31 impl Future
for WakeOnceThenComplete
{
33 fn poll(mut self: Pin
<&mut Self>, cx
: &mut Context
<'_
>) -> Poll
<u8> {
37 cx
.waker().wake_by_ref();
44 fn wait(fut
: impl Future
<Output
= u8>) -> u8 {
45 let mut fut
= Box
::pin(fut
);
46 let counter
= Arc
::new(Counter { wakes: AtomicUsize::new(0) }
);
47 let waker
= ArcWake
::into_waker(counter
.clone());
48 let mut cx
= Context
::from_waker(&waker
);
50 match fut
.as_mut().poll(&mut cx
) {
51 Poll
::Ready(out
) => return out
,
57 fn base() -> WakeOnceThenComplete { WakeOnceThenComplete(false, 1) }
59 async
fn await1_level1() -> u8 {
63 async
fn await2_level1() -> u8 {
64 base().await
+ base().await
67 async
fn await3_level1() -> u8 {
68 base().await
+ base().await
+ base().await
71 async
fn await3_level2() -> u8 {
72 await3_level1().await
+ await3_level1().await
+ await3_level1().await
75 async
fn await3_level3() -> u8 {
76 await3_level2().await
+ await3_level2().await
+ await3_level2().await
79 async
fn await3_level4() -> u8 {
80 await3_level3().await
+ await3_level3().await
+ await3_level3().await
83 async
fn await3_level5() -> u8 {
84 await3_level4().await
+ await3_level4().await
+ await3_level4().await
88 assert_eq
!(2, std
::mem
::size_of_val(&base()));
89 assert_eq
!(8, std
::mem
::size_of_val(&await1_level1()));
90 assert_eq
!(12, std
::mem
::size_of_val(&await2_level1()));
91 assert_eq
!(12, std
::mem
::size_of_val(&await3_level1()));
92 assert_eq
!(24, std
::mem
::size_of_val(&await3_level2()));
93 assert_eq
!(36, std
::mem
::size_of_val(&await3_level3()));
94 assert_eq
!(48, std
::mem
::size_of_val(&await3_level4()));
95 assert_eq
!(60, std
::mem
::size_of_val(&await3_level5()));
97 assert_eq
!(1, wait(base()));
98 assert_eq
!(1, wait(await1_level1()));
99 assert_eq
!(2, wait(await2_level1()));
100 assert_eq
!(3, wait(await3_level1()));
101 assert_eq
!(9, wait(await3_level2()));
102 assert_eq
!(27, wait(await3_level3()));
103 assert_eq
!(81, wait(await3_level4()));
104 assert_eq
!(243, wait(await3_level5()));