@@ -231,6 +231,10 @@ impl fmt::Debug for Context<'_> {
231
231
/// this might be done to wake a future when a blocking function call completes on another
232
232
/// thread.
233
233
///
234
+ /// Note that it is preferable to use `waker.clone_from(&new_waker)` instead
235
+ /// of `*waker = new_waker.clone()`, as the former will avoid cloning the waker
236
+ /// unnecessarily if the two wakers [wake the same task](Self::will_wake).
237
+ ///
234
238
/// [`Future::poll()`]: core::future::Future::poll
235
239
/// [`Poll::Pending`]: core::task::Poll::Pending
236
240
#[ cfg_attr( not( doc) , repr( transparent) ) ] // work around https://github.com/rust-lang/rust/issues/66401
@@ -302,7 +306,9 @@ impl Waker {
302
306
/// when the `Waker`s would awaken the same task. However, if this function
303
307
/// returns `true`, it is guaranteed that the `Waker`s will awaken the same task.
304
308
///
305
- /// This function is primarily used for optimization purposes.
309
+ /// This function is primarily used for optimization purposes — for example,
310
+ /// this type's [`clone_from`](Self::clone_from) implementation uses it to
311
+ /// avoid cloning the waker when they would wake the same task anyway.
306
312
#[ inline]
307
313
#[ must_use]
308
314
#[ stable( feature = "futures_api" , since = "1.36.0" ) ]
@@ -382,6 +388,13 @@ impl Clone for Waker {
382
388
waker : unsafe { ( self . waker . vtable . clone ) ( self . waker . data ) } ,
383
389
}
384
390
}
391
+
392
+ #[ inline]
393
+ fn clone_from ( & mut self , source : & Self ) {
394
+ if !self . will_wake ( source) {
395
+ * self = source. clone ( ) ;
396
+ }
397
+ }
385
398
}
386
399
387
400
#[ stable( feature = "futures_api" , since = "1.36.0" ) ]
0 commit comments