riot_wrappers::msg::v2

Struct SendPort

Source
pub struct SendPort<TYPE: Send, const TYPENO: u16> {
    destination: KernelPID,
    _phantom: PhantomData<TYPE>,
}
Available on riot_module_core_msg and crate feature with_msg_v2 only.
Expand description

Object through which messages of a precise type can be sent to a precise thread.

Unlike the ReceivePort, the SendPort is Send and Sync by adding the runtime information of the destination Kernel PID to it. That process / thread is guaranteed to be live (might have crashed to a non-unwinding panic but not been reused) by the construction of SendPort: A SendPort can only be created when the indicated thread gives the appropriate guarantees.

It is owned, but can be used through shared references (which are Send as well); ownership matters if one ever wants to stop accepting a certain type of message again.

If it is desired that multiple callers send on a single typeno (where the callers can not just share a shared reference), it would be possible to create a version of the SendPort that counts its clones at runtime and can only be returned when all of them are recombined, or just to create a version that can be cloned at will but never recombined any more. (One way to do the latter would be to add a const boolean type parameter “CLONED”; a .cloneable(self) -> Self would switch that from false to true, and then copy and clone would be implemented for the result, whereas recombination would only be implemented for the CLONED = false version).

Fields§

§destination: KernelPID§_phantom: PhantomData<TYPE>

Implementations§

Source§

impl<TYPE: Send, const TYPENO: u16> SendPort<TYPE, TYPENO>

Source

pub fn try_send(&self, data: TYPE) -> Result<(), TYPE>

Send a message to a given ticket.

On success, the data is received by (or enqueued in, if a queue is set up) the thread indicated in the ticket. Otherwise, the data is returned.

Note that while the underlying msg_try_send function knows two error cases (thread is not ready to receive, and invalid PID), the presence of a SendPort implies that the thread promised to still be around (it may have crashed, but it can’t have exited), so that error can not happen here. (If it still does due to errors in unsafe code, trips up a debug assert and else is handled like the other failure to send).

Source

pub fn destination(&self) -> KernelPID

Access the port’s destination

This is particularly useful when messages are not sent directly through SendPort::try_send(), but the port is stored (or dropped) after having been typechecked to match the described API of a C function that will send messages – and after having extracted the destination for these messages with this function.

Trait Implementations§

Source§

impl<TYPE: Send, const TYPENO: u16> Debug for SendPort<TYPE, TYPENO>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<TYPE, const TYPENO: u16> Freeze for SendPort<TYPE, TYPENO>

§

impl<TYPE, const TYPENO: u16> RefUnwindSafe for SendPort<TYPE, TYPENO>
where TYPE: RefUnwindSafe,

§

impl<TYPE, const TYPENO: u16> Send for SendPort<TYPE, TYPENO>

§

impl<TYPE, const TYPENO: u16> Sync for SendPort<TYPE, TYPENO>
where TYPE: Sync,

§

impl<TYPE, const TYPENO: u16> Unpin for SendPort<TYPE, TYPENO>
where TYPE: Unpin,

§

impl<TYPE, const TYPENO: u16> UnwindSafe for SendPort<TYPE, TYPENO>
where TYPE: 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> IntoSwitch for T

Source§

fn into_switch<ActiveLevel>(self) -> Switch<T, ActiveLevel>

Consumes the IoPin returning a Switch of the appropriate ActiveLevel. Read more
Source§

fn into_active_low_switch(self) -> Switch<Self, ActiveLow>
where Self: Sized,

Consumes the IoPin returning a Switch<IoPin, ActiveLow>. Read more
Source§

fn into_active_high_switch(self) -> Switch<Self, ActiveHigh>
where Self: Sized,

Consumes the IoPin returning a Switch<IoPin, ActiveHigh>. Read more
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.

Layout§

Note: Most layout information is completely unstable and may even differ between compilations. The only exception is types with certain repr(...) attributes. Please see the Rust Reference's “Type Layout” chapter for details on type layout guarantees.

Size: 2 bytes