42 lines
923 B
Rust
42 lines
923 B
Rust
|
use std::{ptr::NonNull, task::Poll};
|
||
|
|
||
|
struct TaskRef;
|
||
|
|
||
|
struct Header {
|
||
|
vtable: &'static Vtable,
|
||
|
}
|
||
|
|
||
|
struct Vtable {
|
||
|
poll: unsafe fn(TaskRef) -> Poll<()>,
|
||
|
deallocate: unsafe fn(NonNull<Header>),
|
||
|
}
|
||
|
|
||
|
// in the "Header" type, which is a private type in maitake
|
||
|
impl Header {
|
||
|
pub(crate) const fn new_stub() -> Self {
|
||
|
unsafe fn nop(_ptr: TaskRef) -> Poll<()> {
|
||
|
Poll::Pending
|
||
|
}
|
||
|
|
||
|
unsafe fn nop_deallocate(ptr: NonNull<Header>) {
|
||
|
unreachable!("stub task ({ptr:p}) should never be deallocated!");
|
||
|
}
|
||
|
|
||
|
Self { vtable: &Vtable { poll: nop, deallocate: nop_deallocate } }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// This is a public type in `maitake`
|
||
|
#[repr(transparent)]
|
||
|
#[cfg_attr(loom, allow(dead_code))]
|
||
|
pub struct TaskStub {
|
||
|
hdr: Header,
|
||
|
}
|
||
|
|
||
|
impl TaskStub {
|
||
|
/// Create a new unique stub [`Task`].
|
||
|
pub const fn new() -> Self {
|
||
|
Self { hdr: Header::new_stub() }
|
||
|
}
|
||
|
}
|