Skip to main content

DcpsRuntime

Struct DcpsRuntime 

Source
pub struct DcpsRuntime {
    pub guid_prefix: GuidPrefix,
    pub domain_id: i32,
    pub spdp_multicast_rx: Arc<UdpTransport>,
    pub spdp_unicast: Arc<UdpTransport>,
    pub user_unicast: Arc<UdpTransport>,
    pub sedp: Arc<Mutex<SedpStack>>,
    pub type_lookup_endpoints: TypeLookupEndpoints,
    pub type_lookup_server: Arc<Mutex<TypeLookupServer>>,
    pub type_lookup_client: Arc<Mutex<TypeLookupClient>>,
    pub security_builtin: Mutex<Option<Arc<Mutex<SecurityBuiltinStack>>>>,
    pub config: RuntimeConfig,
    pub wlp: Arc<Mutex<WlpEndpoint>>,
    /* private fields */
}
Expand description

Die Runtime eines DomainParticipants. Hosts alle Background- Threads und UDP-Sockets.

Fields§

§guid_prefix: GuidPrefix

Participant-GUID-Prefix (12-Byte Identifier, random pro Instanz).

§domain_id: i32

Domain-Id.

§spdp_multicast_rx: Arc<UdpTransport>

SPDP-Multicast-Receiver-Socket.

§spdp_unicast: Arc<UdpTransport>

SPDP-Unicast-Socket (fuer bidirektionales SPDP, B2).

§user_unicast: Arc<UdpTransport>

User-Data-Unicast-Socket (Default-User-Unicast, wohin Peers matched-Samples senden).

§sedp: Arc<Mutex<SedpStack>>

SEDP-Stack fuer Publication/Subscription-Announce + -Discovery.

§type_lookup_endpoints: TypeLookupEndpoints

TypeLookup-Service Builtin-Endpoint-GUIDs (XTypes 1.3 §7.6.3.3.4).

§type_lookup_server: Arc<Mutex<TypeLookupServer>>

TypeLookup-Server (server-side Handler über die lokale TypeRegistry).

§type_lookup_client: Arc<Mutex<TypeLookupClient>>

TypeLookup-Client (client-side Correlation-Table für outstanding Requests).

§security_builtin: Mutex<Option<Arc<Mutex<SecurityBuiltinStack>>>>

Security-Builtin-Endpoint-Stack (DCPSParticipantStatelessMessage + DCPSParticipantVolatile- MessageSecure). None, solange kein Security-Plugin aktiv ist — der Hot-Path ueberspringt dann jeglichen Security-Builtin- Demux. Some wird via DcpsRuntime::enable_security_builtins gesetzt, sobald die Factory ein Plugin registriert hat.

§config: RuntimeConfig

Konfiguration (cloned aus RuntimeConfig).

§wlp: Arc<Mutex<WlpEndpoint>>

Writer-Liveliness-Protocol-Endpoint(RTPS 2.5 §8.4.13). Sendet periodische ParticipantMessageData-Heartbeats und trackt Last-Seen pro remote Participant.

Implementations§

Source§

impl DcpsRuntime

Source

pub fn start( domain_id: i32, guid_prefix: GuidPrefix, config: RuntimeConfig, ) -> Result<Arc<Self>>

Startet eine neue Runtime fuer einen Participant.

§Errors

TransportError wenn eines der 3 UDP-Sockets nicht bindet (z.B. Port-Kollision auf dem SPDP-Multicast-Port in einer anderen SO_REUSE-less DDS-Instanz).

Source

pub fn user_locator(&self) -> Locator

Lokaler Unicast-Locator fuer User-Data (wird in SPDP announced).

Source

pub fn spdp_unicast_locator(&self) -> Locator

Lokaler Unicast-Locator fuer SPDP-Metatraffic.

Source

pub fn announced_builtin_endpoint_set(&self) -> u32

Liefert die BuiltinEndpointSet-Bitmaske, die der Runtime aktuell im SPDP-Beacon annonciert. Wird fuer Tests + Diagnose genutzt; produktive Konsumenten sollten den SPDP-Beacon selbst dekodieren.

Source

pub fn register_type_object(&self, obj: TypeObject) -> Result<EquivalenceHash>

Registriert einen TypeObject in der lokalen TypeLookup-Server- Registry. Andere Participants können diesen Type danach via getTypes-Request abfragen (XTypes 1.3 §7.6.3.3.4).

Liefert den EquivalenceHash des registrierten Types zurück (Caller kann ihn z.B. in PublicationBuiltinTopicData als PID_TYPE_INFORMATION-Hint einbetten).

§Errors

DdsError::PreconditionNotMet bei Lock-Poisoning oder Hash- Berechnungs-Fehler.

Source

pub fn send_type_lookup_request( &self, peer: GuidPrefix, type_hashes: &[EquivalenceHash], ) -> Result<Option<RequestId>>

Sendet einen getTypes-Request an einen discovered Peer und liefert eine RequestId zurück, mit der der Caller den asynchronen Reply später korrelieren kann (XTypes 1.3 §7.6.3.3.4 + TypeLookupClient::handle_reply).

peer muss in discovered_participants() sein — sonst wird None zurückgegeben (kein bekannter Peer-Locator). Bei erfolgreichem Send wird die Request-Sample-Identity-Sequence als RequestId zurückgegeben; eingehender Reply wird auf dieser Sequence-ID korreliert.

§Errors

DdsError::PreconditionNotMet bei Encode-Fehlern oder Lock- Poisoning.

Source

pub fn enable_security_builtins( &self, vendor_id: VendorId, ) -> Arc<Mutex<SecurityBuiltinStack>>

aktiviert den Security-Builtin-Endpoint-Stack (DCPSParticipantStatelessMessage + DCPSParticipantVolatile- MessageSecure). Wird typischerweise von der Factory aufgerufen, sobald ein Security-Plugin auf dem Participant registriert ist. Idempotent: zweiter Aufruf hat keine Wirkung. Liefert den (ggf. frisch erzeugten) Stack-Handle zurueck.

Source

pub fn security_builtin_snapshot( &self, ) -> Option<Arc<Mutex<SecurityBuiltinStack>>>

Snapshot-Handle auf den Security-Builtin-Stack. None, wenn enable_security_builtins noch nicht aufgerufen wurde.

Source

pub fn assert_liveliness(&self)

assert_liveliness() auf dem DomainParticipant (DCPS 1.4 §2.2.3.11 MANUAL_BY_PARTICIPANT). Sendet beim naechsten Tick genau einen WLP-Heartbeat mit kind = MANUAL_BY_PARTICIPANT, alle Reader die diesen Participant matchen frischen ihren Last-Seen-Timestamp auf. Idempotent — Mehrfachaufruf binnen einer Tick-Periode resultiert in mehreren Wire-Sends bis zur Cap (MAX_QUEUED_PULSES = 32).

Source

pub fn assert_writer_liveliness(&self, topic_token: Vec<u8>)

assert_liveliness() auf einem DataWriter (DCPS 1.4 §2.2.3.11 MANUAL_BY_TOPIC). topic_token ist ein opaque Token, das matchende Reader nutzen koennen, um den Pulse einem konkreten Topic zuzuordnen. Wir verwenden ZeroDDS-Vendor-Kind (Cyclone / Fast-DDS ignorieren das Vendor-Kind, was Spec-konform ist — MSB-set in kind fordert “ignore unknown” Verhalten).

Source

pub fn peer_liveliness_last_seen(&self, prefix: &GuidPrefix) -> Option<Duration>

Aktueller WLP-Last-Seen-Timestamp eines remote Peers (relativ zum Runtime-Start). None wenn der Peer noch keinen WLP- Heartbeat geschickt hat.

Source

pub fn peer_capabilities(&self, prefix: &GuidPrefix) -> Option<PeerCapabilities>

Liefert die zerodds_discovery::PeerCapabilities eines remote Peers, basierend auf seinem zuletzt empfangenen SPDP-Beacon. None wenn der Peer noch nicht via SPDP entdeckt wurde.

Source

pub fn discovered_participants(&self) -> Vec<DiscoveredParticipant>

Snapshot der aktuell entdeckten remote Participants. Key = Guid-Prefix, Value = zuletzt gesehener Beacon-Inhalt.

Source

pub fn attach_builtin_sinks(&self, sinks: BuiltinSinks)

Verdrahtet die BuiltinSinks des DomainParticipants in den Discovery-Hot-Path. Ab diesem Aufruf landen alle SPDP-/SEDP-Receive-Events als Samples in den 4 Builtin-Topic-Readern.

Wird vom DomainParticipant-Konstruktor genau einmal beim Setup aufgerufen.

Source

pub fn attach_ignore_filter(&self, filter: IgnoreFilter)

Verdrahtet den IgnoreFilter des DomainParticipants in den Discovery-Hot-Path. Ab diesem Aufruf werden SPDP-/SEDP-Receive-Events gegen den Filter geprueft, bevor sie als Builtin-Sample gepusht oder als SEDP-Match-Quelle herangezogen werden.

Wird vom DomainParticipant-Konstruktor genau einmal beim Setup aufgerufen.

Source

pub fn announce_publication( &self, data: &PublicationBuiltinTopicData, ) -> Result<()>

Kuendigt eine lokale Publication ueber SEDP an. Der Runtime sendet die erzeugten Datagramme sofort an alle bereits entdeckten Remote-Participants.

§Errors

WireError wenn Encoding fehlschlaegt.

Source

pub fn announce_subscription( &self, data: &SubscriptionBuiltinTopicData, ) -> Result<()>

Kuendigt eine lokale Subscription ueber SEDP an. Analog zu announce_publication.

§Errors

WireError wenn Encoding fehlschlaegt.

Source

pub fn register_user_writer(&self, cfg: UserWriterConfig) -> Result<EntityId>

Registriert einen lokalen User-Writer. Der Caller bekommt die Writer-EntityId; fuer Sends via write_user_sample(eid, ...).

In Runtime gibt es noch kein automatisches SEDP-Announce + Matching — das kommt in B4b. Aktuell ist register_user_writer nur die Verdrahtung.

§Errors

PreconditionNotMet wenn der Registry-Mutex vergiftet ist.

Source

pub fn register_user_reader( &self, cfg: UserReaderConfig, ) -> Result<(EntityId, Receiver<UserSample>)>

Registriert einen lokalen User-Reader. Gibt die Reader-EntityId und einen mpsc::Receiver zurueck, ueber den DataReader-Handles ankommende Samples konsumieren.

§Errors

PreconditionNotMet wenn der Registry-Mutex vergiftet ist. Registriert einen User-Reader. Liefert die EntityId und einen mpsc::Receiver<UserSample> — Alive-Samples liefern Payload, Lifecycle-Marker tragen Key-Hash + ChangeKind.

Source

pub fn write_user_sample(&self, eid: EntityId, payload: Vec<u8>) -> Result<()>

Schreibt einen Sample an einen registrierten User-Writer und versendet die erzeugten Datagramme.

Der Payload wird mit dem RTPS-Serialized-Payload-Header (Encapsulation-Scheme) versehen, bevor er in die DATA- Submessage geht. OMG RTPS 2.5 §9.4.2.13 verlangt genau diese 4 Bytes am Anfang jedes serialisierten User-Payloads: [0x00, 0x07, 0x00, 0x00] = XCDR2_LE + options=0. Ohne diesen Header weigern sich Cyclone/Fast-DDS-Reader, das Sample zu deliverieren (sie parsen die ersten 4 Bytes als encapsulation kind + options und droppen unknown-scheme).

§Errors
  • BadParameter wenn die EntityId keinen registrierten Writer hat.
  • WireError bei Encoding-Fehler.
Source

pub fn write_user_lifecycle( &self, eid: EntityId, key_hash: [u8; 16], status_bits: u32, ) -> Result<()>

Sendet einen Lifecycle-Marker (dispose/unregister_instance) an alle matched Reader. Spec §2.2.2.4.2.10/.7 + §9.6.3.9 PID_STATUS_INFO. status_bits ist die OR-Verknuepfung von zerodds_rtps::inline_qos::status_info::DISPOSED und/oder UNREGISTERED.

§Errors
  • BadParameter wenn die EntityId keinen registrierten Writer hat.
  • WireError bei Encode-Fehler.
Source

pub fn discovered_publications_count(&self) -> usize

Snapshot aller aktuell bekannten remote Publications (Topic Name + Type Name + Writer-GUID).

Source

pub fn discovered_subscriptions_count(&self) -> usize

Snapshot aller aktuell bekannten remote Subscriptions.

Source

pub fn user_writer_matched_count(&self, eid: EntityId) -> usize

Anzahl matched Remote-Reader fuer einen lokalen User-Writer. von DataWriter::wait_for_matched_subscription gepollt.

Source

pub fn user_writer_matched_subscription_handles( &self, eid: EntityId, ) -> Vec<InstanceHandle>

Liste der InstanceHandles aller matched Remote-Reader fuer einen lokalen User-Writer (Spec §2.2.2.4.2.x get_matched_subscriptions). Pro Reader die letzten 16 byte der GUID als InstanceHandle.

Source

pub fn user_reader_matched_publication_handles( &self, eid: EntityId, ) -> Vec<InstanceHandle>

Liste der InstanceHandles aller matched Remote-Writer fuer einen lokalen User-Reader (Spec §2.2.2.5.x get_matched_publications).

Source

pub fn user_writer_offered_deadline_missed(&self, eid: EntityId) -> u64

Counter fuer verpasste offered-Deadlines am User-Writer. Spec OMG DDS 1.4 §2.2.4.2.9 OFFERED_DEADLINE_MISSED_STATUS.

Source

pub fn user_reader_requested_deadline_missed(&self, eid: EntityId) -> u64

Counter fuer verpasste requested-Deadlines am User-Reader. Spec §2.2.4.2.11 REQUESTED_DEADLINE_MISSED_STATUS.

Source

pub fn user_reader_liveliness_status(&self, eid: EntityId) -> (bool, u64, u64)

Aktueller Liveliness-Status eines lokalen User-Readers. Spec §2.2.4.2.14 LIVELINESS_CHANGED_STATUS: (alive, alive_count, not_alive_count).

Source

pub fn user_writer_liveliness_lost(&self, eid: EntityId) -> u64

Counter LivelinessLost am User-Writer (Spec §2.2.4.2.10). Wird von check_writer_liveliness inkrementiert.

Source

pub fn user_writer_offered_incompatible_qos( &self, eid: EntityId, ) -> OfferedIncompatibleQosStatus

Snapshot OfferedIncompatibleQosStatus am Writer.

Source

pub fn user_reader_requested_incompatible_qos( &self, eid: EntityId, ) -> RequestedIncompatibleQosStatus

Snapshot RequestedIncompatibleQosStatus am Reader.

Source

pub fn user_reader_sample_lost(&self, eid: EntityId) -> u64

Sample-Lost-Counter (Reader-Seite). Spec §2.2.4.2.6.2.

Source

pub fn user_reader_sample_rejected(&self, eid: EntityId) -> SampleRejectedStatus

Sample-Rejected-Status (Reader-Seite). Spec §2.2.4.2.6.3.

Source

pub fn record_sample_lost(&self, eid: EntityId, count: u32)

Recordet ein verlorenes Sample am User-Reader. Wird von Resource-Limit- oder Decode-Failure-Pfaden gerufen — der Detector ist Application-extern, weil Sample-Lost je nach Implementation aus mehreren Quellen kommt (Cache-Drop, Decode- Fail, Sequence-Number-Gap-Drop).

Source

pub fn record_sample_rejected( &self, eid: EntityId, kind: SampleRejectedStatusKind, instance: InstanceHandle, )

Recordet ein rejectedes Sample am User-Reader.

Source

pub fn assert_writer_liveliness_eid(&self, eid: EntityId)

Manual-Liveliness-Assert am User-Writer. Setzt den last_liveliness_assert-Timestamp. Bei LivelinessKind::Automatic wird zusaetzlich last_write mitgesetzt — der Liveliness-Pfad faellt sonst nie ueber den assert-Trigger, weil jeder erfolgreiche write bereits den Liveliness-Tick uebernimmt.

Source

pub fn user_writer_all_acknowledged(&self, eid: EntityId) -> bool

True wenn alle matched Reader alle bisher geschriebenen Samples acknowledgt haben. Leerer Cache oder keine Proxies → true.

Source

pub fn register_user_reader_waker(&self, eid: EntityId, waker: Option<Waker>)

Spec §3.1 zerodds-async-1.0: registriert den Waker eines async-Readers im UserReaderSlot. Bei sample_tx.send wird der Waker geweckt. None als Argument loescht den Waker (z.B. nach Drop des Async-Readers).

Source

pub fn set_user_reader_listener( &self, eid: EntityId, listener: Option<UserReaderListener>, ) -> bool

Listener-Callback fuer Alive-Sample- Arrival am User-Reader registrieren. None loescht einen vorhandenen Listener.

Listener feuert synchron im Recv-Thread des recv_user_data_loop — siehe Vertrags-Doku am UserReaderListener-Type. Eliminiert die User-Polling- Latenz (~50-100 µs) gegenueber sample_tx.recv().

Returns true wenn der Reader-Slot existiert und der Listener gesetzt wurde, false wenn der EID kein bekannter User-Reader ist.

Source

pub fn user_reader_matched_count(&self, eid: EntityId) -> usize

Anzahl matched Remote-Writer fuer einen lokalen User-Reader.

Source

pub fn wait_match_event(&self, timeout: Duration) -> bool

D.5e Phase-1 — Wartet bis ein Match-Event eintritt oder das Timeout erreicht ist. Ersetzt 20-ms-Polling in DataReader::wait_for_matched_* und DataWriter::wait_for_matched_*.

Caller checkt selbst den Match-Count (per user_*_matched_count) vor und nach dem Wait — diese Funktion ist nur die Block-Mechanik. Returns false wenn Timeout erreicht, true wenn Notify kam.

Source

pub fn wait_ack_event(&self, timeout: Duration) -> bool

D.5e Phase-1 — Wartet bis ein ACK-Event eintritt oder Timeout. Ersetzt 50-ms-Polling in DataWriter::wait_for_acknowledgments.

Source

pub fn set_shm_locator(&self, eid: EntityId, bytes: Vec<u8>)

ADR-0006 — Setzt PID_SHM_LOCATOR-Bytes fuer einen lokalen User-Writer in der Side-Map. Wird vom DataWriter aufgerufen, sobald set_flat_backend ein Same-Host-Backend (POSIX shm / Iceoryx2) angeschlossen hat. Beim naechsten SEDP-Push injiziert der Wire-Encoder das PID 0x8001 in die PublicationData.

Source

pub fn shm_locator(&self, eid: EntityId) -> Option<Vec<u8>>

ADR-0006 — Liest die PID_SHM_LOCATOR-Bytes fuer einen lokalen User-Writer aus der Side-Map. Liefert None, wenn kein Same-Host-Backend gesetzt ist.

Source

pub fn clear_shm_locator(&self, eid: EntityId)

ADR-0006 — Entfernt PID_SHM_LOCATOR-Eintrag (z.B. wenn der User-Writer ohne Backend re-konfiguriert wird).

Source

pub fn shutdown(&self)

Stoppt alle Worker-Threads (recv-loops + tick-loop) und joinst sie. Idempotent — mehrfach-Aufrufe sind no-op.

Shutdown-Verzoegerung: bis ~1 s, weil die Recv-Threads in recv() mit 1 s read-timeout sitzen. Nach Beendigung des aktuellen recv()-Calls checken sie das stop-Flag und terminieren.

Trait Implementations§

Source§

impl Debug for DcpsRuntime

Source§

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

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

impl Drop for DcpsRuntime

Source§

fn drop(&mut self)

Executes the destructor for this type. 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> 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.