@@ -32,7 +32,6 @@ use crate::{
3232
3333pub struct Iceoryx2PubSub {
3434 node : Node < ipc_threadsafe:: Service > ,
35- listener_worker_runtime : tokio:: runtime:: Runtime ,
3635 pub publishers : PublisherSet < ipc_threadsafe:: Service > ,
3736 pub subscribers : SubscriberSet < ipc_threadsafe:: Service > ,
3837 pub listeners : ListenerMap ,
@@ -43,28 +42,22 @@ impl Iceoryx2PubSub {
4342 let node = NodeBuilder :: new ( )
4443 . create :: < ipc_threadsafe:: Service > ( )
4544 . expect ( "Failed to create Iceoryx2 Node" ) ;
46- let listener_worker_runtime =
47- tokio:: runtime:: Runtime :: new ( ) . expect ( "Failed to create Tokio runtime" ) ;
4845 let transport = Arc :: new ( Self {
4946 node,
5047 publishers : RwLock :: new ( HashMap :: new ( ) ) ,
5148 subscribers : RwLock :: new ( HashMap :: new ( ) ) ,
5249 listeners : RwLock :: new ( HashMap :: new ( ) ) ,
53- listener_worker_runtime,
5450 } ) ;
55- Iceoryx2WorkerDispatcher :: start_listener_worker (
56- & transport. listener_worker_runtime ,
57- transport. clone ( ) ,
58- ) ;
51+ Iceoryx2WorkerDispatcher :: start_listener_worker ( transport. clone ( ) ) ;
5952 transport
6053 }
6154
6255 pub fn create_subscriber (
6356 & self ,
57+ service_name : ServiceName ,
6458 ) -> Result < Subscriber < ipc_threadsafe:: Service , UMessageZeroCopy , UProtocolHeader > , UStatus >
6559 {
6660 // Placeholder implementation
67- let service_name: ServiceName = "example_service" . try_into ( ) . unwrap ( ) ;
6861 let service = self
6962 . node
7063 . service_builder ( & service_name)
@@ -85,15 +78,21 @@ impl Iceoryx2PubSub {
8578 service_name : ServiceName ,
8679 ) -> Result < Arc < Publisher < ipc_threadsafe:: Service , UMessageZeroCopy , UProtocolHeader > > , UStatus >
8780 {
88- let publishers = self . publishers . read ( ) . await ;
89- if publishers. contains_key ( & service_name) {
90- let publisher = publishers. get ( & service_name) . unwrap ( ) ;
91- return Ok ( publisher. clone ( ) ) ;
81+ let publisher = self . get_publisher ( service_name. clone ( ) ) . await ;
82+ if let Some ( publisher) = publisher {
83+ return Ok ( publisher) ;
9284 }
93- let service_name_res: Result < ServiceName , _ > = service_name. as_str ( ) . try_into ( ) ;
85+ self . create_publisher ( service_name) . await
86+ }
87+
88+ async fn create_publisher (
89+ & self ,
90+ service_name : ServiceName ,
91+ ) -> Result < Arc < Publisher < ipc_threadsafe:: Service , UMessageZeroCopy , UProtocolHeader > > , UStatus >
92+ {
9493 let service = self
9594 . node
96- . service_builder ( & service_name_res . unwrap ( ) )
95+ . service_builder ( & service_name )
9796 . publish_subscribe :: < UMessageZeroCopy > ( )
9897 . user_header :: < UProtocolHeader > ( )
9998 . open_or_create ( )
@@ -110,25 +109,30 @@ impl Iceoryx2PubSub {
110109 Ok ( publisher. clone ( ) )
111110 }
112111
112+ async fn get_publisher (
113+ & self ,
114+ service_name : ServiceName ,
115+ ) -> Option < Arc < Publisher < ipc_threadsafe:: Service , UMessageZeroCopy , UProtocolHeader > > > {
116+ let publishers = self . publishers . read ( ) . await ;
117+ if publishers. contains_key ( & service_name) {
118+ let publisher = publishers. get ( & service_name) . unwrap ( ) ;
119+ return Some ( publisher. clone ( ) ) ;
120+ }
121+ None
122+ }
123+
113124 pub async fn relay ( & self ) -> Result < ( ) , UStatus > {
114- let current_thread_runtime = tokio:: runtime:: Builder :: new_current_thread ( )
115- . enable_all ( )
116- . build ( )
117- . map_err ( |e| {
118- UStatus :: fail_with_code (
119- UCode :: INTERNAL ,
120- format ! ( "Failed to build current_thread runtime: {e}" ) ,
121- )
122- } ) ?;
123- for ( service_name, subscriber) in self . subscribers . read ( ) . await . iter ( ) {
125+ let subscribers = self . subscribers . read ( ) . await ;
126+ for ( service_name, subscriber) in subscribers. iter ( ) {
124127 match subscriber. receive ( ) {
125128 Ok ( Some ( sample) ) => {
126129 let payload = sample;
127130 if let Some ( listeners_to_notify) = self . listeners . read ( ) . await . get ( service_name)
128131 {
129132 for listener in listeners_to_notify. iter ( ) {
130133 let listener: & ComparableListener = listener;
131- current_thread_runtime. block_on ( listener. on_receive ( payload. 0 . clone ( ) ) ) ;
134+ let payload_clone = payload. 0 . clone ( ) ;
135+ listener. on_receive ( payload_clone) . await ;
132136 }
133137 }
134138 }
@@ -182,14 +186,17 @@ impl UTransport for Iceoryx2PubSub {
182186 ) -> Result < ( ) , UStatus > {
183187 up_rust:: verify_filter_criteria ( source_filter, sink_filter) ?;
184188 let service_name = compute_service_name (
185- & source_filter,
189+ source_filter,
186190 sink_filter,
187191 MessagingPattern :: PublishSubscribe ,
188192 ) ?;
189- let subscribers = self . subscribers . read ( ) . await ;
193+ let has_subscriber = {
194+ let subscribers = self . subscribers . read ( ) . await ;
195+ subscribers. contains_key ( & service_name)
196+ } ;
190197 // insert subscriber for service name if it does not already exist
191- if !subscribers . contains_key ( & service_name ) {
192- let subscriber = self . create_subscriber ( ) ?;
198+ if !has_subscriber {
199+ let subscriber = self . create_subscriber ( service_name . clone ( ) ) ?;
193200 let mut subscribers = self . subscribers . write ( ) . await ;
194201 subscribers. insert ( service_name. clone ( ) , Arc :: new ( subscriber) ) ;
195202 }
@@ -212,7 +219,7 @@ impl UTransport for Iceoryx2PubSub {
212219 ) -> Result < ( ) , UStatus > {
213220 up_rust:: verify_filter_criteria ( source_filter, sink_filter) ?;
214221 let service_name = compute_service_name (
215- & source_filter,
222+ source_filter,
216223 sink_filter,
217224 MessagingPattern :: PublishSubscribe ,
218225 ) ?;
0 commit comments