Coverage Report

Created: 2025-07-23 06:18

/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::<_>