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: GuidPrefixParticipant-GUID-Prefix (12-Byte Identifier, random pro Instanz).
domain_id: i32Domain-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: TypeLookupEndpointsTypeLookup-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: RuntimeConfigKonfiguration (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
impl DcpsRuntime
Sourcepub fn start(
domain_id: i32,
guid_prefix: GuidPrefix,
config: RuntimeConfig,
) -> Result<Arc<Self>>
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).
Sourcepub fn user_locator(&self) -> Locator
pub fn user_locator(&self) -> Locator
Lokaler Unicast-Locator fuer User-Data (wird in SPDP announced).
Sourcepub fn spdp_unicast_locator(&self) -> Locator
pub fn spdp_unicast_locator(&self) -> Locator
Lokaler Unicast-Locator fuer SPDP-Metatraffic.
Sourcepub fn announced_builtin_endpoint_set(&self) -> u32
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.
Sourcepub fn register_type_object(&self, obj: TypeObject) -> Result<EquivalenceHash>
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.
Sourcepub fn send_type_lookup_request(
&self,
peer: GuidPrefix,
type_hashes: &[EquivalenceHash],
) -> Result<Option<RequestId>>
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.
Sourcepub fn enable_security_builtins(
&self,
vendor_id: VendorId,
) -> Arc<Mutex<SecurityBuiltinStack>> ⓘ
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.
Sourcepub fn security_builtin_snapshot(
&self,
) -> Option<Arc<Mutex<SecurityBuiltinStack>>>
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.
Sourcepub fn assert_liveliness(&self)
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).
Sourcepub fn assert_writer_liveliness(&self, topic_token: Vec<u8>)
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).
Sourcepub fn peer_liveliness_last_seen(&self, prefix: &GuidPrefix) -> Option<Duration>
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.
Sourcepub fn peer_capabilities(&self, prefix: &GuidPrefix) -> Option<PeerCapabilities>
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.
Sourcepub fn discovered_participants(&self) -> Vec<DiscoveredParticipant>
pub fn discovered_participants(&self) -> Vec<DiscoveredParticipant>
Snapshot der aktuell entdeckten remote Participants. Key = Guid-Prefix, Value = zuletzt gesehener Beacon-Inhalt.
Sourcepub fn attach_builtin_sinks(&self, sinks: BuiltinSinks)
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.
Sourcepub fn attach_ignore_filter(&self, filter: IgnoreFilter)
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.
Sourcepub fn announce_publication(
&self,
data: &PublicationBuiltinTopicData,
) -> Result<()>
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.
Sourcepub fn announce_subscription(
&self,
data: &SubscriptionBuiltinTopicData,
) -> Result<()>
pub fn announce_subscription( &self, data: &SubscriptionBuiltinTopicData, ) -> Result<()>
Kuendigt eine lokale Subscription ueber SEDP an. Analog zu
announce_publication.
§Errors
WireError wenn Encoding fehlschlaegt.
Sourcepub fn register_user_writer(&self, cfg: UserWriterConfig) -> Result<EntityId>
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.
Sourcepub fn register_user_reader(
&self,
cfg: UserReaderConfig,
) -> Result<(EntityId, Receiver<UserSample>)>
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.
Sourcepub fn write_user_sample(&self, eid: EntityId, payload: Vec<u8>) -> Result<()>
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
BadParameterwenn die EntityId keinen registrierten Writer hat.WireErrorbei Encoding-Fehler.
Sourcepub fn write_user_lifecycle(
&self,
eid: EntityId,
key_hash: [u8; 16],
status_bits: u32,
) -> Result<()>
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
BadParameterwenn die EntityId keinen registrierten Writer hat.WireErrorbei Encode-Fehler.
Sourcepub fn discovered_publications_count(&self) -> usize
pub fn discovered_publications_count(&self) -> usize
Snapshot aller aktuell bekannten remote Publications (Topic Name + Type Name + Writer-GUID).
Sourcepub fn discovered_subscriptions_count(&self) -> usize
pub fn discovered_subscriptions_count(&self) -> usize
Snapshot aller aktuell bekannten remote Subscriptions.
Sourcepub fn user_writer_matched_count(&self, eid: EntityId) -> usize
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.
Sourcepub fn user_writer_matched_subscription_handles(
&self,
eid: EntityId,
) -> Vec<InstanceHandle>
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.
Sourcepub fn user_reader_matched_publication_handles(
&self,
eid: EntityId,
) -> Vec<InstanceHandle>
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).
Sourcepub fn user_writer_offered_deadline_missed(&self, eid: EntityId) -> u64
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.
Sourcepub fn user_reader_requested_deadline_missed(&self, eid: EntityId) -> u64
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.
Sourcepub fn user_reader_liveliness_status(&self, eid: EntityId) -> (bool, u64, u64)
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).
Sourcepub fn user_writer_liveliness_lost(&self, eid: EntityId) -> u64
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.
Sourcepub fn user_writer_offered_incompatible_qos(
&self,
eid: EntityId,
) -> OfferedIncompatibleQosStatus
pub fn user_writer_offered_incompatible_qos( &self, eid: EntityId, ) -> OfferedIncompatibleQosStatus
Snapshot OfferedIncompatibleQosStatus am Writer.
Sourcepub fn user_reader_requested_incompatible_qos(
&self,
eid: EntityId,
) -> RequestedIncompatibleQosStatus
pub fn user_reader_requested_incompatible_qos( &self, eid: EntityId, ) -> RequestedIncompatibleQosStatus
Snapshot RequestedIncompatibleQosStatus am Reader.
Sourcepub fn user_reader_sample_lost(&self, eid: EntityId) -> u64
pub fn user_reader_sample_lost(&self, eid: EntityId) -> u64
Sample-Lost-Counter (Reader-Seite). Spec §2.2.4.2.6.2.
Sourcepub fn user_reader_sample_rejected(&self, eid: EntityId) -> SampleRejectedStatus
pub fn user_reader_sample_rejected(&self, eid: EntityId) -> SampleRejectedStatus
Sample-Rejected-Status (Reader-Seite). Spec §2.2.4.2.6.3.
Sourcepub fn record_sample_lost(&self, eid: EntityId, count: u32)
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).
Sourcepub fn record_sample_rejected(
&self,
eid: EntityId,
kind: SampleRejectedStatusKind,
instance: InstanceHandle,
)
pub fn record_sample_rejected( &self, eid: EntityId, kind: SampleRejectedStatusKind, instance: InstanceHandle, )
Recordet ein rejectedes Sample am User-Reader.
Sourcepub fn assert_writer_liveliness_eid(&self, eid: EntityId)
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.
Sourcepub fn user_writer_all_acknowledged(&self, eid: EntityId) -> bool
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.
Sourcepub fn register_user_reader_waker(&self, eid: EntityId, waker: Option<Waker>)
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).
Sourcepub fn set_user_reader_listener(
&self,
eid: EntityId,
listener: Option<UserReaderListener>,
) -> bool
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.
Sourcepub fn user_reader_matched_count(&self, eid: EntityId) -> usize
pub fn user_reader_matched_count(&self, eid: EntityId) -> usize
Anzahl matched Remote-Writer fuer einen lokalen User-Reader.
Sourcepub fn wait_match_event(&self, timeout: Duration) -> bool
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.
Sourcepub fn wait_ack_event(&self, timeout: Duration) -> bool
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.
Sourcepub fn set_shm_locator(&self, eid: EntityId, bytes: Vec<u8>)
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.
Sourcepub fn shm_locator(&self, eid: EntityId) -> Option<Vec<u8>>
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.
Sourcepub fn clear_shm_locator(&self, eid: EntityId)
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).
Sourcepub fn shutdown(&self)
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.