Closed
Description
use futures::task::ArcWake;
struct Temp;
impl ArcWake for Temp {
fn wake_by_ref(arc_self: &std::sync::Arc<Self>) {
let _ = arc_self;
}
}
fn main() {
let temp = std::sync::Arc::new(Temp);
let waker = futures::task::waker_ref(&temp);
println!("{waker:?} {:?}", waker.clone());
futures::executor::block_on(async {});
}
Sometimes (more often than not, in my experience), when running in --release
mode, vtable addresses don't match:
WakerRef { waker: ManuallyDrop { value: Waker { data: 0x5654d35e5b90, vtable: 0x5654d2ad62b8 } }, _marker: PhantomData<&()> } Waker { data: 0x5654d35e5b90, vtable: 0x5654d2ad6308 }
Why this matters: this leads to AtomicWaker
and alike to clone (or, worse, wake) on each poll because of how Waker::will_wake
compares Waker
s. Example: sdroege/async-tungstenite#133
Is this a compiler bug? If yes, can we do something to mitigate it?
Metadata
Metadata
Assignees
Labels
No labels