11#![ allow( clippy:: cast_ptr_alignment) ] // clippy is too strict here
22
3+ use super :: arc_wake:: { ArcWake , clone_arc_raw, wake_arc_raw} ;
34use std:: marker:: PhantomData ;
45use std:: ops:: Deref ;
56use std:: sync:: Arc ;
67use std:: task:: { Waker , RawWaker , RawWakerVTable } ;
7- use super :: ArcWake ;
88
99/// A [`Waker`](::std::task::Waker) that is only valid for a given lifetime.
1010///
@@ -38,28 +38,8 @@ impl<'a> Deref for WakerRef<'a> {
3838 }
3939}
4040
41- // Another reference vtable which doesn't do decrement the refcount on drop.
42- // However on clone it will create a vtable which equals a Waker, and on wake
43- // it will call the nonlocal wake function.
44- macro_rules! ref_vtable {
45- ( $ty: ident) => {
46- & RawWakerVTable {
47- clone: clone_arc_raw:: <$ty>,
48- drop: noop,
49- wake: wake_arc_raw:: <$ty>,
50- }
51- } ;
52- }
53-
54- macro_rules! owned_vtable {
55- ( $ty: ident) => {
56- & RawWakerVTable {
57- clone: clone_arc_raw:: <$ty>,
58- drop: drop_arc_raw:: <$ty>,
59- wake: wake_arc_raw:: <$ty>,
60- }
61- } ;
62- }
41+ #[ inline]
42+ unsafe fn noop ( _data : * const ( ) ) { }
6343
6444/// Creates a reference to a [`Waker`](::std::task::Waker)
6545/// from a local [`wake`](::std::task::Wake).
@@ -75,36 +55,16 @@ where
7555 // This is potentially not stable
7656 let ptr = & * wake as & W as * const W as * const ( ) ;
7757
58+ // Similar to `waker_vtable`, but with a no-op `drop` function.
59+ // Clones of the resulting `RawWaker` will still be dropped normally.
60+ let vtable = & RawWakerVTable {
61+ clone : clone_arc_raw :: < W > ,
62+ drop : noop,
63+ wake : wake_arc_raw :: < W > ,
64+ } ;
65+
7866 let waker = unsafe {
79- Waker :: new_unchecked ( RawWaker :: new ( ptr, ref_vtable ! ( W ) ) )
67+ Waker :: new_unchecked ( RawWaker :: new ( ptr, vtable ) )
8068 } ;
8169 WakerRef :: new ( waker)
8270}
83-
84- unsafe fn noop ( _data : * const ( ) ) {
85- }
86-
87- unsafe fn increase_refcount < T : ArcWake > ( data : * const ( ) ) {
88- // Retain Arc by creating a copy
89- let arc: Arc < T > = Arc :: from_raw ( data as * const T ) ;
90- let arc_clone = arc. clone ( ) ;
91- // Forget the Arcs again, so that the refcount isn't decrased
92- let _ = Arc :: into_raw ( arc) ;
93- let _ = Arc :: into_raw ( arc_clone) ;
94- }
95-
96- unsafe fn clone_arc_raw < T : ArcWake > ( data : * const ( ) ) -> RawWaker {
97- increase_refcount :: < T > ( data) ;
98- RawWaker :: new ( data, owned_vtable ! ( T ) )
99- }
100-
101- unsafe fn drop_arc_raw < T : ArcWake > ( data : * const ( ) ) {
102- // Drop Arc
103- let _: Arc < T > = Arc :: from_raw ( data as * const T ) ;
104- }
105-
106- unsafe fn wake_arc_raw < T : ArcWake > ( data : * const ( ) ) {
107- let arc: Arc < T > = Arc :: from_raw ( data as * const T ) ;
108- ArcWake :: wake ( & arc) ; // TODO: If this panics, the refcount is too big
109- let _ = Arc :: into_raw ( arc) ;
110- }
0 commit comments