@@ -138,10 +138,7 @@ fn raw_waker<W: Wake + Send + Sync + 'static>(waker: Arc<W>) -> RawWaker {
138
138
// Increment the reference count of the arc to clone it.
139
139
unsafe fn clone_waker < W : Wake + Send + Sync + ' static > ( waker : * const ( ) ) -> RawWaker {
140
140
unsafe { Arc :: increment_strong_count ( waker as * const W ) } ;
141
- RawWaker :: new (
142
- waker as * const ( ) ,
143
- & RawWakerVTable :: new ( clone_waker :: < W > , wake :: < W > , wake_by_ref :: < W > , drop_waker :: < W > ) ,
144
- )
141
+ RawWaker :: new ( waker as * const ( ) , vtable :: < W > ( ) )
145
142
}
146
143
147
144
// Wake by value, moving the Arc into the Wake::wake function
@@ -161,10 +158,15 @@ fn raw_waker<W: Wake + Send + Sync + 'static>(waker: Arc<W>) -> RawWaker {
161
158
unsafe { Arc :: decrement_strong_count ( waker as * const W ) } ;
162
159
}
163
160
164
- RawWaker :: new (
165
- Arc :: into_raw ( waker) as * const ( ) ,
166
- & RawWakerVTable :: new ( clone_waker :: < W > , wake :: < W > , wake_by_ref :: < W > , drop_waker :: < W > ) ,
167
- )
161
+ fn vtable < W : Wake + Send + Sync + ' static > ( ) -> & ' static RawWakerVTable {
162
+ // Perform this const promotion in a single place used by both initial
163
+ // construction of the RawWaker below and by clone_waker above. This way
164
+ // the vtable pointer comparison performed by Waker::will_wake sees that
165
+ // a cloned waker will wake the original one and vice versa.
166
+ & RawWakerVTable :: new ( clone_waker :: < W > , wake :: < W > , wake_by_ref :: < W > , drop_waker :: < W > )
167
+ }
168
+
169
+ RawWaker :: new ( Arc :: into_raw ( waker) as * const ( ) , vtable :: < W > ( ) )
168
170
}
169
171
170
172
/// An analogous trait to `Wake` but used to construct a `LocalWaker`. This API
@@ -306,10 +308,7 @@ fn local_raw_waker<W: LocalWake + 'static>(waker: Rc<W>) -> RawWaker {
306
308
// Increment the reference count of the Rc to clone it.
307
309
unsafe fn clone_waker < W : LocalWake + ' static > ( waker : * const ( ) ) -> RawWaker {
308
310
unsafe { Rc :: increment_strong_count ( waker as * const W ) } ;
309
- RawWaker :: new (
310
- waker as * const ( ) ,
311
- & RawWakerVTable :: new ( clone_waker :: < W > , wake :: < W > , wake_by_ref :: < W > , drop_waker :: < W > ) ,
312
- )
311
+ RawWaker :: new ( waker as * const ( ) , vtable :: < W > ( ) )
313
312
}
314
313
315
314
// Wake by value, moving the Rc into the LocalWake::wake function
@@ -329,8 +328,9 @@ fn local_raw_waker<W: LocalWake + 'static>(waker: Rc<W>) -> RawWaker {
329
328
unsafe { Rc :: decrement_strong_count ( waker as * const W ) } ;
330
329
}
331
330
332
- RawWaker :: new (
333
- Rc :: into_raw ( waker) as * const ( ) ,
334
- & RawWakerVTable :: new ( clone_waker :: < W > , wake :: < W > , wake_by_ref :: < W > , drop_waker :: < W > ) ,
335
- )
331
+ fn vtable < W : LocalWake + ' static > ( ) -> & ' static RawWakerVTable {
332
+ & RawWakerVTable :: new ( clone_waker :: < W > , wake :: < W > , wake_by_ref :: < W > , drop_waker :: < W > )
333
+ }
334
+
335
+ RawWaker :: new ( Rc :: into_raw ( waker) as * const ( ) , vtable :: < W > ( ) )
336
336
}
0 commit comments