@@ -67,14 +67,14 @@ pub struct SecureWrapping {
6767
6868// This is partial receiver state to be sent to a Reader or a Writer with a
6969// Submessage
70- #[ derive( Debug , Clone ) ]
71- pub struct MessageReceiverState {
70+ #[ derive( Debug ) ]
71+ pub struct MessageReceiverState < ' a > {
7272 pub source_guid_prefix : GuidPrefix ,
73- pub unicast_reply_locator_list : Vec < Locator > ,
73+ pub unicast_reply_locator_list : & ' a [ Locator ] ,
7474
7575 #[ allow( dead_code) ]
7676 // TODO: We do not use the multicast Locators from InfoReply for anything for now.
77- pub multicast_reply_locator_list : Vec < Locator > ,
77+ pub multicast_reply_locator_list : & ' a [ Locator ] ,
7878
7979 pub source_timestamp : Option < Timestamp > ,
8080
@@ -83,12 +83,12 @@ pub struct MessageReceiverState {
8383 pub secure_rtps_wrapped : Option < SecureWrapping > ,
8484}
8585
86- impl Default for MessageReceiverState {
86+ impl Default for MessageReceiverState < ' _ > {
8787 fn default ( ) -> Self {
8888 Self {
8989 source_guid_prefix : GuidPrefix :: default ( ) ,
90- unicast_reply_locator_list : Vec :: default ( ) ,
91- multicast_reply_locator_list : Vec :: default ( ) ,
90+ unicast_reply_locator_list : & [ ] ,
91+ multicast_reply_locator_list : & [ ] ,
9292 source_timestamp : Some ( Timestamp :: INVALID ) ,
9393 #[ cfg( feature = "security" ) ]
9494 secure_rtps_wrapped : None ,
@@ -183,15 +183,24 @@ impl MessageReceiver {
183183 }
184184 }
185185
186- fn clone_partial_message_receiver_state ( & self ) -> MessageReceiverState {
187- MessageReceiverState {
186+ fn partial_message_receiver_state (
187+ & mut self ,
188+ target_reader_entity_id : & EntityId ,
189+ ) -> (
190+ MessageReceiverState < ' _ > ,
191+ Option < & mut Reader > ,
192+ Option < & SecurityPluginsHandle > ,
193+ ) {
194+ let reader = self . available_readers . get_mut ( target_reader_entity_id) ;
195+ let state = MessageReceiverState {
188196 source_guid_prefix : self . source_guid_prefix ,
189- unicast_reply_locator_list : self . unicast_reply_locator_list . clone ( ) ,
190- multicast_reply_locator_list : self . multicast_reply_locator_list . clone ( ) ,
197+ unicast_reply_locator_list : & self . unicast_reply_locator_list ,
198+ multicast_reply_locator_list : & self . multicast_reply_locator_list ,
191199 source_timestamp : self . source_timestamp ,
192200 #[ cfg( feature = "security" ) ]
193201 secure_rtps_wrapped : self . secure_rtps_wrapped . clone ( ) ,
194- }
202+ } ;
203+ ( state, reader, self . security_plugins . as_ref ( ) )
195204 }
196205
197206 pub fn add_reader ( & mut self , new_reader : Reader ) {
@@ -569,17 +578,16 @@ impl MessageReceiver {
569578 }
570579 }
571580
572- let mr_state = self . clone_partial_message_receiver_state ( ) ;
581+ let ( mr_state, target_reader, security_plugins) =
582+ self . partial_message_receiver_state ( & target_reader_entity_id) ;
573583 let writer_entity_id = submessage. sender_entity_id ( ) ;
574584 let source_guid_prefix = mr_state. source_guid_prefix ;
575585 let source_guid = & GUID {
576586 prefix : source_guid_prefix,
577587 entity_id : writer_entity_id,
578588 } ;
579589
580- let security_plugins = self . security_plugins . clone ( ) ;
581-
582- let target_reader = if let Some ( target_reader) = self . reader_mut ( target_reader_entity_id) {
590+ let target_reader = if let Some ( target_reader) = target_reader {
583591 target_reader
584592 } else {
585593 return error ! ( "No reader matching the CryptoHandle found" ) ;
@@ -588,7 +596,7 @@ impl MessageReceiver {
588596 match submessage {
589597 WriterSubmessage :: Data ( data, data_flags) => {
590598 Self :: decode_and_handle_data (
591- security_plugins. as_ref ( ) ,
599+ security_plugins,
592600 source_guid,
593601 data,
594602 data_flags,
@@ -623,7 +631,7 @@ impl MessageReceiver {
623631
624632 WriterSubmessage :: DataFrag ( datafrag, flags) => {
625633 Self :: decode_and_handle_datafrag (
626- security_plugins. as_ref ( ) ,
634+ security_plugins,
627635 source_guid,
628636 datafrag. clone ( ) ,
629637 flags,
@@ -646,7 +654,7 @@ impl MessageReceiver {
646654 data : Data ,
647655 data_flags : BitFlags < DATA_Flags , u8 > ,
648656 reader : & mut Reader ,
649- mr_state : & MessageReceiverState ,
657+ mr_state : & MessageReceiverState < ' _ > ,
650658 ) {
651659 reader. handle_data_msg ( data, data_flags, mr_state) ;
652660 }
@@ -658,7 +666,7 @@ impl MessageReceiver {
658666 data : Data ,
659667 data_flags : BitFlags < DATA_Flags , u8 > ,
660668 reader : & mut Reader ,
661- mr_state : & MessageReceiverState ,
669+ mr_state : & MessageReceiverState < ' _ > ,
662670 ) {
663671 let Data {
664672 inline_qos,
@@ -705,7 +713,7 @@ impl MessageReceiver {
705713 datafrag : DataFrag ,
706714 datafrag_flags : BitFlags < DATAFRAG_Flags , u8 > ,
707715 reader : & mut Reader ,
708- mr_state : & MessageReceiverState ,
716+ mr_state : & MessageReceiverState < ' _ > ,
709717 ) {
710718 let payload_buffer_length = datafrag. serialized_payload . len ( ) ;
711719 if payload_buffer_length
@@ -737,7 +745,7 @@ impl MessageReceiver {
737745 datafrag : DataFrag ,
738746 datafrag_flags : BitFlags < DATAFRAG_Flags , u8 > ,
739747 reader : & mut Reader ,
740- mr_state : & MessageReceiverState ,
748+ mr_state : & MessageReceiverState < ' _ > ,
741749 ) {
742750 let DataFrag {
743751 inline_qos,
0 commit comments