Skip to main content

AsyncCompletion

Struct AsyncCompletion 

Source
pub struct AsyncCompletion<T> { /* private fields */ }
Expand description

An async completion handler for FFI callbacks

This type provides a Future that resolves when an async callback completes. It uses Arc<Mutex> internally for thread-safe signaling and waker management.

Implementations§

Source§

impl<T> AsyncCompletion<T>

Source

pub fn create() -> (AsyncCompletionFuture<T>, SyncCompletionPtr)

Create a new async completion handler and return the context pointer for FFI

Returns a tuple of (future, context_ptr) where:

  • future can be awaited to get the result
  • context_ptr should be passed to the FFI callback
Source

pub unsafe fn complete_ok(context: SyncCompletionPtr, value: T)

Signal successful completion with a value

§Safety

The context pointer must be a valid pointer obtained from AsyncCompletion::new(). This function consumes the Arc reference, so it must only be called once per context.

Source

pub unsafe fn complete_err(context: SyncCompletionPtr, error: String)

Signal completion with an error

§Safety

The context pointer must be a valid pointer obtained from AsyncCompletion::new(). This function consumes the Arc reference, so it must only be called once per context.

Source

pub unsafe fn complete_with_result( context: SyncCompletionPtr, result: Result<T, String>, )

Signal completion with a result

§Safety

The context pointer must be a valid pointer obtained from AsyncCompletion::create() and not yet freed. The intended FFI contract is that the callback fires exactly once per context.

The consumed AtomicBool provides defence in depth against Swift firing the callback twice on the same still-live allocation. The same residual UAF contract documented on SyncCompletion::complete_with_result applies here: a third callback after both the legitimate fire AND the consumer’s drop of the AsyncCompletionFuture would dereference a freed pointer. Apple’s APIs do not exhibit that pattern.

§Panics

Panics if the internal mutex is poisoned.

Auto Trait Implementations§

§

impl<T> Freeze for AsyncCompletion<T>

§

impl<T> RefUnwindSafe for AsyncCompletion<T>
where T: RefUnwindSafe,

§

impl<T> Send for AsyncCompletion<T>
where T: Send,

§

impl<T> Sync for AsyncCompletion<T>
where T: Sync,

§

impl<T> Unpin for AsyncCompletion<T>
where T: Unpin,

§

impl<T> UnsafeUnpin for AsyncCompletion<T>

§

impl<T> UnwindSafe for AsyncCompletion<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.