Struct esp_idf_svc::eventloop::EspEventLoop

source ·
pub struct EspEventLoop<T>(/* private fields */)
where
    T: EspEventLoopType;

Implementations§

source§

impl<T> EspEventLoop<T>

source

pub fn subscribe_async<D>(&self) -> Result<EspAsyncSubscription<D, T>, EspError>

source

pub fn subscribe<D, F>( &self, callback: F, ) -> Result<EspSubscription<'static, T>, EspError>
where D: EspEventDeserializer, F: for<'a> FnMut(D::Data<'a>) + Send + 'static,

source

pub unsafe fn subscribe_nonstatic<'a, D, F>( &self, callback: F, ) -> Result<EspSubscription<'a, T>, EspError>
where D: EspEventDeserializer, F: for<'d> FnMut(D::Data<'d>) + Send + 'a,

§Safety

This method - in contrast to method subscribe - allows the user to pass a non-static callback/closure. This enables users to borrow

  • in the closure - variables that live on the stack - or more generally - in the same scope where the service is created.

HOWEVER: care should be taken NOT to call core::mem::forget() on the service, as that would immediately lead to an UB (crash). Also note that forgetting the service might happen with Rc and Arc when circular references are introduced: https://github.com/rust-lang/rust/issues/24456

The reason is that the closure is actually sent to a hidden ESP IDF thread. This means that if the service is forgotten, Rust is free to e.g. unwind the stack and the closure now owned by this other thread will end up with references to variables that no longer exist.

The destructor of the service takes care - prior to the service being dropped and e.g. the stack being unwind - to remove the closure from the hidden thread and destroy it. Unfortunately, when the service is forgotten, the un-subscription does not happen and invalid references are left dangling.

This “local borrowing” will only be possible to express in a safe way once/if !Leak types are introduced to Rust (i.e. the impossibility to “forget” a type and thus not call its destructor).

source

pub async fn post_async<S>(&self, payload: &S::Data<'_>) -> Result<(), EspError>

source

pub fn post<S>( &self, payload: &S::Data<'_>, timeout: TickType_t, ) -> Result<bool, EspError>

source§

impl<T> EspEventLoop<User<T>>

source

pub fn spin(&mut self, timeout: TickType_t) -> Result<(), EspError>

source§

impl EspEventLoop<System>

source

pub fn take() -> Result<Self, EspError>

source§

impl EspEventLoop<User<Background>>

source

pub fn new(conf: &BackgroundLoopConfiguration<'_>) -> Result<Self, EspError>

source§

impl EspEventLoop<User<Explicit>>

source

pub fn new(conf: &ExplicitLoopConfiguration) -> Result<Self, EspError>

Trait Implementations§

source§

impl<T> Clone for EspEventLoop<T>

source§

fn clone(&self) -> Self

Returns a copy of the value. Read more
1.0.0§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<T> Debug for EspEventLoop<T>
where T: EspEventLoopType + Debug,

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<T> RawHandle for EspEventLoop<User<T>>

§

type Handle = *mut c_void

source§

fn handle(&self) -> Self::Handle

Care should be taken to use the returned ESP-IDF driver raw handle only while the driver is still alive, so as to avoid use-after-free errors.
source§

impl<T> Send for EspEventLoop<T>
where T: EspEventLoopType + Send,

source§

impl<T> Sync for EspEventLoop<T>
where T: EspEventLoopType + Sync,

Auto Trait Implementations§

§

impl<T> Freeze for EspEventLoop<T>

§

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

§

impl<T> Unpin for EspEventLoop<T>

§

impl<T> UnwindSafe for EspEventLoop<T>
where T: RefUnwindSafe,

Blanket Implementations§

§

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

§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
§

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

§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
§

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

§

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

Mutably borrows from an owned value. Read more
§

impl<T> CloneToUninit for T
where T: Clone,

§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
§

impl<T> From<T> for T

§

fn from(t: T) -> T

Returns the argument unchanged.

§

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

§

fn into(self) -> U

Calls U::from(self).

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

§

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

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

§

type Error = Infallible

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

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

Performs the conversion.
§

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

§

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

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

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

Performs the conversion.