futures_task

Trait UnsafeFutureObj

Source
pub unsafe trait UnsafeFutureObj<'a, T>: 'a {
    // Required methods
    fn into_raw(self) -> *mut dyn Future<Output = T> + 'a;
    unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a);
}
Expand description

A custom implementation of a future trait object for FutureObj, providing a vtable with drop support.

This custom representation is typically used only in no_std contexts, where the default Box-based implementation is not available.

§Safety

See the safety notes on individual methods for what guarantees an implementor must provide.

Required Methods§

Source

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Convert an owned instance into a (conceptually owned) fat pointer.

§Safety
§Implementor

The trait implementor must guarantee that it is safe to convert the provided *mut (dyn Future<Output = T> + 'a) into a Pin<&mut (dyn Future<Output = T> + 'a)> and call methods on it, non-reentrantly, until UnsafeFutureObj::drop is called with it.

Source

unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a)

Drops the future represented by the given fat pointer.

§Safety
§Implementor

The trait implementor must guarantee that it is safe to call this function once per into_raw invocation.

§Caller

The caller must ensure:

  • the pointer passed was obtained from an into_raw invocation from this same trait object
  • the pointer is not currently in use as a Pin<&mut (dyn Future<Output = T> + 'a)>
  • the pointer must not be used again after this function is called

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl<'a, T> UnsafeFutureObj<'a, T> for &'a mut (dyn Future<Output = T> + Unpin + 'a)

Source§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Source§

unsafe fn drop(_ptr: *mut dyn Future<Output = T> + 'a)

Source§

impl<'a, T> UnsafeFutureObj<'a, T> for Pin<&'a mut (dyn Future<Output = T> + 'a)>

Source§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Source§

unsafe fn drop(_ptr: *mut dyn Future<Output = T> + 'a)

Source§

impl<'a, T, F> UnsafeFutureObj<'a, T> for &'a mut F
where F: Future<Output = T> + Unpin + 'a,

Source§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Source§

unsafe fn drop(_ptr: *mut dyn Future<Output = T> + 'a)

Source§

impl<'a, T, F> UnsafeFutureObj<'a, T> for Box<F>
where F: Future<Output = T> + 'a,

Source§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Source§

unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a)

Source§

impl<'a, T, F> UnsafeFutureObj<'a, T> for Pin<&'a mut F>
where F: Future<Output = T> + 'a,

Source§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Source§

unsafe fn drop(_ptr: *mut dyn Future<Output = T> + 'a)

Source§

impl<'a, T, F> UnsafeFutureObj<'a, T> for Pin<Box<F>>
where F: Future<Output = T> + 'a,

Source§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Source§

unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a)

Source§

impl<'a, T: 'a> UnsafeFutureObj<'a, T> for Box<dyn Future<Output = T> + 'a>

Source§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Source§

unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a)

Source§

impl<'a, T: 'a> UnsafeFutureObj<'a, T> for Box<dyn Future<Output = T> + Send + 'a>

Source§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Source§

unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a)

Source§

impl<'a, T: 'a> UnsafeFutureObj<'a, T> for Pin<Box<dyn Future<Output = T> + 'a>>

Source§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Source§

unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a)

Source§

impl<'a, T: 'a> UnsafeFutureObj<'a, T> for Pin<Box<dyn Future<Output = T> + Send + 'a>>

Source§

fn into_raw(self) -> *mut dyn Future<Output = T> + 'a

Source§

unsafe fn drop(ptr: *mut dyn Future<Output = T> + 'a)

Implementors§