1
1
#![ allow( clippy:: cast_ptr_alignment) ] // clippy is too strict here
2
2
3
+ use super :: arc_wake:: { ArcWake , clone_arc_raw, wake_arc_raw} ;
3
4
use std:: marker:: PhantomData ;
4
5
use std:: ops:: Deref ;
5
6
use std:: sync:: Arc ;
6
7
use std:: task:: { Waker , RawWaker , RawWakerVTable } ;
7
- use super :: ArcWake ;
8
8
9
9
/// A [`Waker`](::std::task::Waker) that is only valid for a given lifetime.
10
10
///
@@ -38,28 +38,8 @@ impl<'a> Deref for WakerRef<'a> {
38
38
}
39
39
}
40
40
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 ( ) ) { }
63
43
64
44
/// Creates a reference to a [`Waker`](::std::task::Waker)
65
45
/// from a local [`wake`](::std::task::Wake).
@@ -75,36 +55,16 @@ where
75
55
// This is potentially not stable
76
56
let ptr = & * wake as & W as * const W as * const ( ) ;
77
57
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
+
78
66
let waker = unsafe {
79
- Waker :: new_unchecked ( RawWaker :: new ( ptr, ref_vtable ! ( W ) ) )
67
+ Waker :: new_unchecked ( RawWaker :: new ( ptr, vtable ) )
80
68
} ;
81
69
WakerRef :: new ( waker)
82
70
}
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