Coverage Report

Created: 2026-07-06 06:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/futures-task-0.3.21/src/waker.rs
Line
Count
Source
1
use super::arc_wake::ArcWake;
2
use alloc::sync::Arc;
3
use core::mem;
4
use core::task::{RawWaker, RawWakerVTable, Waker};
5
6
1.06M
pub(super) fn waker_vtable<W: ArcWake>() -> &'static RawWakerVTable {
7
1.06M
    &RawWakerVTable::new(
8
1.06M
        clone_arc_raw::<W>,
9
1.06M
        wake_arc_raw::<W>,
10
1.06M
        wake_by_ref_arc_raw::<W>,
11
1.06M
        drop_arc_raw::<W>,
12
1.06M
    )
13
1.06M
}
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
711k
pub(super) fn waker_vtable<W: ArcWake>() -> &'static RawWakerVTable {
7
711k
    &RawWakerVTable::new(
8
711k
        clone_arc_raw::<W>,
9
711k
        wake_arc_raw::<W>,
10
711k
        wake_by_ref_arc_raw::<W>,
11
711k
        drop_arc_raw::<W>,
12
711k
    )
13
711k
}
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
355k
pub(super) fn waker_vtable<W: ArcWake>() -> &'static RawWakerVTable {
7
355k
    &RawWakerVTable::new(
8
355k
        clone_arc_raw::<W>,
9
355k
        wake_arc_raw::<W>,
10
355k
        wake_by_ref_arc_raw::<W>,
11
355k
        drop_arc_raw::<W>,
12
355k
    )
13
355k
}
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
{
23
0
    let ptr = Arc::into_raw(wake).cast::<()>();
24
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
711k
unsafe fn increase_refcount<T: ArcWake>(data: *const ()) {
33
    // Retain Arc, but don't touch refcount by wrapping in ManuallyDrop
34
711k
    let arc = mem::ManuallyDrop::new(Arc::<T>::from_raw(data.cast::<T>()));
35
    // Now increase refcount, but don't drop new refcount either
36
711k
    let _arc_clone: mem::ManuallyDrop<_> = arc.clone();
37
711k
}
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
711k
unsafe fn increase_refcount<T: ArcWake>(data: *const ()) {
33
    // Retain Arc, but don't touch refcount by wrapping in ManuallyDrop
34
711k
    let arc = mem::ManuallyDrop::new(Arc::<T>::from_raw(data.cast::<T>()));
35
    // Now increase refcount, but don't drop new refcount either
36
711k
    let _arc_clone: mem::ManuallyDrop<_> = arc.clone();
37
711k
}
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
711k
unsafe fn clone_arc_raw<T: ArcWake>(data: *const ()) -> RawWaker {
41
711k
    increase_refcount::<T>(data);
42
711k
    RawWaker::new(data, waker_vtable::<T>())
43
711k
}
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
711k
unsafe fn clone_arc_raw<T: ArcWake>(data: *const ()) -> RawWaker {
41
711k
    increase_refcount::<T>(data);
42
711k
    RawWaker::new(data, waker_vtable::<T>())
43
711k
}
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
494
unsafe fn wake_arc_raw<T: ArcWake>(data: *const ()) {
46
494
    let arc: Arc<T> = Arc::from_raw(data.cast::<T>());
47
494
    ArcWake::wake(arc);
48
494
}
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
494
unsafe fn wake_arc_raw<T: ArcWake>(data: *const ()) {
46
494
    let arc: Arc<T> = Arc::from_raw(data.cast::<T>());
47
494
    ArcWake::wake(arc);
48
494
}
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
    // 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
711k
unsafe fn drop_arc_raw<T: ArcWake>(data: *const ()) {
58
711k
    drop(Arc::<T>::from_raw(data.cast::<T>()))
59
711k
}
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
711k
unsafe fn drop_arc_raw<T: ArcWake>(data: *const ()) {
58
711k
    drop(Arc::<T>::from_raw(data.cast::<T>()))
59
711k
}
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::<_>