/rust/registry/src/index.crates.io-6f17d22bba15001f/futures-task-0.3.21/src/waker.rs
Line | Count | Source (jump to first uncovered line) |
1 | | use super::arc_wake::ArcWake; |
2 | | use alloc::sync::Arc; |
3 | | use core::mem; |
4 | | use core::task::{RawWaker, RawWakerVTable, Waker}; |
5 | | |
6 | 705k | pub(super) fn waker_vtable<W: ArcWake>() -> &'static RawWakerVTable { |
7 | 705k | &RawWakerVTable::new( |
8 | 705k | clone_arc_raw::<W>, |
9 | 705k | wake_arc_raw::<W>, |
10 | 705k | wake_by_ref_arc_raw::<W>, |
11 | 705k | drop_arc_raw::<W>, |
12 | 705k | ) |
13 | 705k | } futures_task::waker::waker_vtable::<futures_util::stream::futures_unordered::task::Task<futures_util::future::future::remote_handle::Remote<devices::virtio::block::asynchronous::handle_queue::{closure#0}>>> Line | Count | Source | 6 | 470k | pub(super) fn waker_vtable<W: ArcWake>() -> &'static RawWakerVTable { | 7 | 470k | &RawWakerVTable::new( | 8 | 470k | clone_arc_raw::<W>, | 9 | 470k | wake_arc_raw::<W>, | 10 | 470k | wake_by_ref_arc_raw::<W>, | 11 | 470k | drop_arc_raw::<W>, | 12 | 470k | ) | 13 | 470k | } |
Unexecuted instantiation: futures_task::waker::waker_vtable::<futures_util::stream::futures_unordered::task::Task<devices::virtio::scsi::device::process_one_chain::{closure#0}>> futures_task::waker::waker_vtable::<futures_util::stream::futures_unordered::task::Task<devices::virtio::block::asynchronous::process_one_chain::{closure#0}>> Line | Count | Source | 6 | 234k | pub(super) fn waker_vtable<W: ArcWake>() -> &'static RawWakerVTable { | 7 | 234k | &RawWakerVTable::new( | 8 | 234k | clone_arc_raw::<W>, | 9 | 234k | wake_arc_raw::<W>, | 10 | 234k | wake_by_ref_arc_raw::<W>, | 11 | 234k | drop_arc_raw::<W>, | 12 | 234k | ) | 13 | 234k | } |
Unexecuted instantiation: futures_task::waker::waker_vtable::<cros_async::blocking::sys::linux::block_on::Waker> Unexecuted instantiation: futures_task::waker::waker_vtable::<futures_util::stream::futures_unordered::task::Task<core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future<Output = ()> + core::marker::Send>>>> Unexecuted instantiation: futures_task::waker::waker_vtable::<futures_util::stream::futures_unordered::task::Task<futures_task::future_obj::LocalFutureObj<()>>> Unexecuted instantiation: futures_task::waker::waker_vtable::<futures_executor::local_pool::ThreadNotify> Unexecuted instantiation: futures_task::waker::waker_vtable::<futures_util::stream::stream::flatten_unordered::InnerWaker> Unexecuted instantiation: futures_task::waker::waker_vtable::<_> |
14 | | |
15 | | /// Creates a [`Waker`] from an `Arc<impl ArcWake>`. |
16 | | /// |
17 | | /// The returned [`Waker`] will call |
18 | | /// [`ArcWake.wake()`](ArcWake::wake) if awoken. |
19 | 0 | pub fn waker<W>(wake: Arc<W>) -> Waker |
20 | 0 | where |
21 | 0 | W: ArcWake + 'static, |
22 | 0 | { |
23 | 0 | let ptr = Arc::into_raw(wake).cast::<()>(); |
24 | 0 |
|
25 | 0 | unsafe { Waker::from_raw(RawWaker::new(ptr, waker_vtable::<W>())) } |
26 | 0 | } Unexecuted instantiation: futures_task::waker::waker::<futures_util::stream::stream::flatten_unordered::InnerWaker> Unexecuted instantiation: futures_task::waker::waker::<_> |
27 | | |
28 | | // FIXME: panics on Arc::clone / refcount changes could wreak havoc on the |
29 | | // code here. We should guard against this by aborting. |
30 | | |
31 | | #[allow(clippy::redundant_clone)] // The clone here isn't actually redundant. |
32 | 470k | unsafe fn increase_refcount<T: ArcWake>(data: *const ()) { |
33 | 470k | // Retain Arc, but don't touch refcount by wrapping in ManuallyDrop |
34 | 470k | let arc = mem::ManuallyDrop::new(Arc::<T>::from_raw(data.cast::<T>())); |
35 | 470k | // Now increase refcount, but don't drop new refcount either |
36 | 470k | let _arc_clone: mem::ManuallyDrop<_> = arc.clone(); |
37 | 470k | } futures_task::waker::increase_refcount::<futures_util::stream::futures_unordered::task::Task<futures_util::future::future::remote_handle::Remote<devices::virtio::block::asynchronous::handle_queue::{closure#0}>>> Line | Count | Source | 32 | 470k | unsafe fn increase_refcount<T: ArcWake>(data: *const ()) { | 33 | 470k | // Retain Arc, but don't touch refcount by wrapping in ManuallyDrop | 34 | 470k | let arc = mem::ManuallyDrop::new(Arc::<T>::from_raw(data.cast::<T>())); | 35 | 470k | // Now increase refcount, but don't drop new refcount either | 36 | 470k | let _arc_clone: mem::ManuallyDrop<_> = arc.clone(); | 37 | 470k | } |
Unexecuted instantiation: futures_task::waker::increase_refcount::<futures_util::stream::futures_unordered::task::Task<devices::virtio::scsi::device::process_one_chain::{closure#0}>> Unexecuted instantiation: futures_task::waker::increase_refcount::<futures_util::stream::futures_unordered::task::Task<devices::virtio::block::asynchronous::process_one_chain::{closure#0}>> Unexecuted instantiation: futures_task::waker::increase_refcount::<cros_async::blocking::sys::linux::block_on::Waker> Unexecuted instantiation: futures_task::waker::increase_refcount::<futures_util::stream::futures_unordered::task::Task<core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future<Output = ()> + core::marker::Send>>>> Unexecuted instantiation: futures_task::waker::increase_refcount::<futures_util::stream::futures_unordered::task::Task<futures_task::future_obj::LocalFutureObj<()>>> Unexecuted instantiation: futures_task::waker::increase_refcount::<futures_executor::local_pool::ThreadNotify> Unexecuted instantiation: futures_task::waker::increase_refcount::<futures_util::stream::stream::flatten_unordered::InnerWaker> Unexecuted instantiation: futures_task::waker::increase_refcount::<_> |
38 | | |
39 | | // used by `waker_ref` |
40 | 470k | unsafe fn clone_arc_raw<T: ArcWake>(data: *const ()) -> RawWaker { |
41 | 470k | increase_refcount::<T>(data); |
42 | 470k | RawWaker::new(data, waker_vtable::<T>()) |
43 | 470k | } futures_task::waker::clone_arc_raw::<futures_util::stream::futures_unordered::task::Task<futures_util::future::future::remote_handle::Remote<devices::virtio::block::asynchronous::handle_queue::{closure#0}>>> Line | Count | Source | 40 | 470k | unsafe fn clone_arc_raw<T: ArcWake>(data: *const ()) -> RawWaker { | 41 | 470k | increase_refcount::<T>(data); | 42 | 470k | RawWaker::new(data, waker_vtable::<T>()) | 43 | 470k | } |
Unexecuted instantiation: futures_task::waker::clone_arc_raw::<futures_util::stream::futures_unordered::task::Task<devices::virtio::scsi::device::process_one_chain::{closure#0}>> Unexecuted instantiation: futures_task::waker::clone_arc_raw::<futures_util::stream::futures_unordered::task::Task<devices::virtio::block::asynchronous::process_one_chain::{closure#0}>> Unexecuted instantiation: futures_task::waker::clone_arc_raw::<cros_async::blocking::sys::linux::block_on::Waker> Unexecuted instantiation: futures_task::waker::clone_arc_raw::<futures_util::stream::futures_unordered::task::Task<core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future<Output = ()> + core::marker::Send>>>> Unexecuted instantiation: futures_task::waker::clone_arc_raw::<futures_util::stream::futures_unordered::task::Task<futures_task::future_obj::LocalFutureObj<()>>> Unexecuted instantiation: futures_task::waker::clone_arc_raw::<futures_executor::local_pool::ThreadNotify> Unexecuted instantiation: futures_task::waker::clone_arc_raw::<futures_util::stream::stream::flatten_unordered::InnerWaker> Unexecuted instantiation: futures_task::waker::clone_arc_raw::<_> |
44 | | |
45 | 274 | unsafe fn wake_arc_raw<T: ArcWake>(data: *const ()) { |
46 | 274 | let arc: Arc<T> = Arc::from_raw(data.cast::<T>()); |
47 | 274 | ArcWake::wake(arc); |
48 | 274 | } futures_task::waker::wake_arc_raw::<futures_util::stream::futures_unordered::task::Task<futures_util::future::future::remote_handle::Remote<devices::virtio::block::asynchronous::handle_queue::{closure#0}>>> Line | Count | Source | 45 | 274 | unsafe fn wake_arc_raw<T: ArcWake>(data: *const ()) { | 46 | 274 | let arc: Arc<T> = Arc::from_raw(data.cast::<T>()); | 47 | 274 | ArcWake::wake(arc); | 48 | 274 | } |
Unexecuted instantiation: futures_task::waker::wake_arc_raw::<futures_util::stream::futures_unordered::task::Task<devices::virtio::scsi::device::process_one_chain::{closure#0}>> Unexecuted instantiation: futures_task::waker::wake_arc_raw::<futures_util::stream::futures_unordered::task::Task<devices::virtio::block::asynchronous::process_one_chain::{closure#0}>> Unexecuted instantiation: futures_task::waker::wake_arc_raw::<cros_async::blocking::sys::linux::block_on::Waker> Unexecuted instantiation: futures_task::waker::wake_arc_raw::<futures_util::stream::futures_unordered::task::Task<core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future<Output = ()> + core::marker::Send>>>> Unexecuted instantiation: futures_task::waker::wake_arc_raw::<futures_util::stream::futures_unordered::task::Task<futures_task::future_obj::LocalFutureObj<()>>> Unexecuted instantiation: futures_task::waker::wake_arc_raw::<futures_executor::local_pool::ThreadNotify> Unexecuted instantiation: futures_task::waker::wake_arc_raw::<futures_util::stream::stream::flatten_unordered::InnerWaker> Unexecuted instantiation: futures_task::waker::wake_arc_raw::<_> |
49 | | |
50 | | // used by `waker_ref` |
51 | 0 | unsafe fn wake_by_ref_arc_raw<T: ArcWake>(data: *const ()) { |
52 | 0 | // Retain Arc, but don't touch refcount by wrapping in ManuallyDrop |
53 | 0 | let arc = mem::ManuallyDrop::new(Arc::<T>::from_raw(data.cast::<T>())); |
54 | 0 | ArcWake::wake_by_ref(&arc); |
55 | 0 | } Unexecuted instantiation: futures_task::waker::wake_by_ref_arc_raw::<futures_util::stream::futures_unordered::task::Task<futures_util::future::future::remote_handle::Remote<devices::virtio::block::asynchronous::handle_queue::{closure#0}>>> Unexecuted instantiation: futures_task::waker::wake_by_ref_arc_raw::<futures_util::stream::futures_unordered::task::Task<devices::virtio::scsi::device::process_one_chain::{closure#0}>> Unexecuted instantiation: futures_task::waker::wake_by_ref_arc_raw::<futures_util::stream::futures_unordered::task::Task<devices::virtio::block::asynchronous::process_one_chain::{closure#0}>> Unexecuted instantiation: futures_task::waker::wake_by_ref_arc_raw::<cros_async::blocking::sys::linux::block_on::Waker> Unexecuted instantiation: futures_task::waker::wake_by_ref_arc_raw::<futures_util::stream::futures_unordered::task::Task<core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future<Output = ()> + core::marker::Send>>>> Unexecuted instantiation: futures_task::waker::wake_by_ref_arc_raw::<futures_util::stream::futures_unordered::task::Task<futures_task::future_obj::LocalFutureObj<()>>> Unexecuted instantiation: futures_task::waker::wake_by_ref_arc_raw::<futures_executor::local_pool::ThreadNotify> Unexecuted instantiation: futures_task::waker::wake_by_ref_arc_raw::<futures_util::stream::stream::flatten_unordered::InnerWaker> Unexecuted instantiation: futures_task::waker::wake_by_ref_arc_raw::<_> |
56 | | |
57 | 469k | unsafe fn drop_arc_raw<T: ArcWake>(data: *const ()) { |
58 | 469k | drop(Arc::<T>::from_raw(data.cast::<T>())) |
59 | 469k | } futures_task::waker::drop_arc_raw::<futures_util::stream::futures_unordered::task::Task<futures_util::future::future::remote_handle::Remote<devices::virtio::block::asynchronous::handle_queue::{closure#0}>>> Line | Count | Source | 57 | 469k | unsafe fn drop_arc_raw<T: ArcWake>(data: *const ()) { | 58 | 469k | drop(Arc::<T>::from_raw(data.cast::<T>())) | 59 | 469k | } |
Unexecuted instantiation: futures_task::waker::drop_arc_raw::<futures_util::stream::futures_unordered::task::Task<devices::virtio::scsi::device::process_one_chain::{closure#0}>> Unexecuted instantiation: futures_task::waker::drop_arc_raw::<futures_util::stream::futures_unordered::task::Task<devices::virtio::block::asynchronous::process_one_chain::{closure#0}>> Unexecuted instantiation: futures_task::waker::drop_arc_raw::<cros_async::blocking::sys::linux::block_on::Waker> Unexecuted instantiation: futures_task::waker::drop_arc_raw::<futures_util::stream::futures_unordered::task::Task<core::pin::Pin<alloc::boxed::Box<dyn core::future::future::Future<Output = ()> + core::marker::Send>>>> Unexecuted instantiation: futures_task::waker::drop_arc_raw::<futures_util::stream::futures_unordered::task::Task<futures_task::future_obj::LocalFutureObj<()>>> Unexecuted instantiation: futures_task::waker::drop_arc_raw::<futures_executor::local_pool::ThreadNotify> Unexecuted instantiation: futures_task::waker::drop_arc_raw::<futures_util::stream::stream::flatten_unordered::InnerWaker> Unexecuted instantiation: futures_task::waker::drop_arc_raw::<_> |