Skip to main content

ReliableWriter

Struct ReliableWriter 

Source
pub struct ReliableWriter { /* private fields */ }
Expand description

Ein Reliable-Writer mit 0..N Reader-Proxies.

Implementations§

Source§

impl ReliableWriter

Source

pub fn new(cfg: ReliableWriterConfig) -> Self

Erzeugt einen leeren Writer.

§Panics
  • cfg.fragment_size == 0
  • cfg.mtu < 20 (RTPS-Header passt nicht rein)
Source

pub fn guid(&self) -> Guid

GUID des Writers.

Source

pub fn reader_proxies(&self) -> &[ReaderProxy]

Read-only-Slice der registrierten Reader-Proxies.

Source

pub fn reader_proxy_count(&self) -> usize

Anzahl registrierter Reader-Proxies.

Source

pub fn remove_samples_up_to(&mut self, up_to_exclusive: SequenceNumber) -> usize

Entfernt Samples mit SN < up_to_exclusive aus dem Cache. Wird von hoeheren Layern fuer Lifespan-Expire genutzt (Spec §2.2.3.16): abgelaufene Samples verschwinden so, dass auch spaete Reader-Proxies sie nicht mehr bekommen.

Source

pub fn cache(&self) -> &HistoryCache

History-Cache (read-only).

Source

pub fn heartbeat_count(&self) -> i32

Anzahl gesendeter HEARTBEATs.

Source

pub fn nackfrag_count(&self) -> i32

Anzahl empfangener NACK_FRAGs.

Source

pub fn unknown_src_count(&self) -> u64

Anzahl ACKNACK/NACK_FRAG-Nachrichten von unbekannten Quellen seit Writer-Start. Typische Ursachen: Misrouting auf Multicast, veraltete Proxies nach remove_reader_proxy, GUID-Spoofing.

Source

pub fn fragment_size(&self) -> u32

Aktuelle Fragment-Size-Konfiguration.

Source

pub fn all_samples_acknowledged(&self) -> bool

Prueft, ob alle Reader-Proxies den aktuell hoechsten Sample-SN im Cache bereits acknowledged haben. Liefert true auch wenn der Cache leer ist oder keine Proxies existieren (nichts zu bestaetigen).

Spec-Basis fuer DataWriter::wait_for_acknowledgments (OMG DDS 1.4 §2.2.2.4.2.22).

Source

pub fn add_reader_proxy(&mut self, proxy: ReaderProxy)

Fuegt einen Reader-Proxy hinzu. Idempotent: wenn ein Proxy mit gleichem remote_reader_guid existiert, wird er ersetzt.

Setzt last_heartbeat = None, damit der naechste tick() sofort einen Heartbeat an alle Proxies (inkl. den neuen) emittiert. RTPS §8.4.15.4: frisch hinzugefuegter ReaderProxy muss Gelegenheit zu AckNack bekommen, sonst wartet er bis zur naechsten periodischen Heartbeat-Runde (Default 1 s) — und bei spaet-gewireten Proxies (nach Cache-Inserts) ist das die einzige Moeglichkeit, die frueh eingefuegten Samples nachzuliefern, da write_sample_with_datagrams nur direkt sendet, wenn der Proxy synchron ist.

Source

pub fn remove_reader_proxy(&mut self, guid: Guid) -> Option<ReaderProxy>

Entfernt den Proxy mit gegebener GUID.

Source

pub fn write( &mut self, payload: &[u8], ) -> Result<Vec<OutboundDatagram>, WireError>

Schreibt einen neuen Sample und fan-outet an alle Proxies.

Pro Proxy entsteht (aggregiert):

  • 1 DATA-Datagram wenn payload.len() <= fragment_size
  • N DATA_FRAG-Datagramme (je Fragment 1 Datagram, kein Mix)
§Errors

SN-Overflow, Cache voll, Body zu gross.

Source

pub fn write_with_heartbeat( &mut self, payload: &[u8], now: Duration, ) -> Result<Vec<OutboundDatagram>, WireError>

D.5e Phase-2: Write + piggyback HEARTBEAT in einer Operation.

Cyclone DDS und FastDDS senden bei jedem write() zusaetzlich einen HEARTBEAT, damit der Reader sofort einen ACKNACK triggern kann. Ohne piggyback muss der Reader bis zum naechsten periodic- HB (default 100 ms) warten — das wird bei 1-in-flight-Roundtrip zum Latenz-Floor.

Diese Methode ist ein Superset von Self::write: emittiert alle DATA-Datagrams und haengt pro matched Reader-Proxy ein HEARTBEAT-Datagram an. last_heartbeat = now wird gesetzt damit tick() nicht doppelt feuert.

§Errors

Wire-Encode-Fehler.

Source

pub fn tick( &mut self, now: Duration, ) -> Result<Vec<OutboundDatagram>, WireError>

Tick-Event: HEARTBEATs + Resends + NACK_FRAG-Responses, aggregiert.

§Errors

Wire-Encode-Fehler.

Source

pub fn handle_acknack( &mut self, src_guid: Guid, base: SequenceNumber, requested: impl IntoIterator<Item = SequenceNumber>, )

Verarbeitet eine eingegangene ACKNACK von src_guid. Unbekannter Sender → no-op.

Source

pub fn handle_nackfrag(&mut self, src_guid: Guid, nf: &NackFragSubmessage)

Verarbeitet ein eingegangenes NACK_FRAG von src_guid.

Source

pub fn write_lifecycle( &mut self, key_hash: [u8; 16], status_bits: u32, ) -> Result<Vec<OutboundDatagram>, WireError>

Sendet einen Lifecycle-Marker (dispose/unregister) an alle matched Reader. Allokiert eine neue Sequence-Number, persistiert eine CacheChange mit dem entsprechenden ChangeKind und baut pro Reader-Proxy eine DATA mit Key-Hash + StatusInfo.

status_bits ist die ODER-Verknuepfung der gewuenschten Bits aus crate::inline_qos::status_info:

  • DISPOSED: NotAliveDisposed
  • UNREGISTERED: NotAliveUnregistered
  • DISPOSED | UNREGISTERED: NotAliveDisposedUnregistered
§Errors

Wire-Encode-Fehler oder Sequence-Number-Overflow.

Trait Implementations§

Source§

impl Clone for ReliableWriter

Source§

fn clone(&self) -> ReliableWriter

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for ReliableWriter

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

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

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

Uses borrowed data to replace owned data, usually by cloning. 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.