From 75ea0dcd969d3b1111142d906289983f9e666fb6 Mon Sep 17 00:00:00 2001 From: Mathias Kraus Date: Sat, 25 Jun 2022 20:39:48 +0200 Subject: [PATCH 1/5] iox-#5 Add multi threaded subscriber teset --- src/tests/basic_pub_sub.rs | 47 +++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/tests/basic_pub_sub.rs b/src/tests/basic_pub_sub.rs index 120b862..fa1cbbf 100644 --- a/src/tests/basic_pub_sub.rs +++ b/src/tests/basic_pub_sub.rs @@ -10,6 +10,8 @@ use crate::SubscriberBuilder; use anyhow::{anyhow, Result}; +use std::thread; + #[repr(C)] #[derive(Default)] struct Counter { @@ -19,7 +21,7 @@ struct Counter { unsafe impl ShmSend for Counter {} #[test] -fn basic_pub_sub() -> Result<()> { +fn single_threaded_subscriber() -> Result<()> { let _roudi = RouDiEnvironment::new(); Runtime::init("basic_pub_sub"); @@ -46,5 +48,48 @@ fn basic_pub_sub() -> Result<()> { _ => return Err(anyhow!("Could not read sample")), } + publisher.stop_offer(); + subscriber.unsubscribe(sample_receiver); + + Ok(()) +} + +#[test] +fn multi_threaded_subscriber() -> Result<()> { + let _roudi = RouDiEnvironment::new(); + + Runtime::init("basic_pub_sub"); + + let (subscriber, sample_receive_token) = + SubscriberBuilder::::new("Test", "BasicPubSub", "Counter") + .queue_capacity(5) + .create_mt()?; + + let publisher = PublisherBuilder::::new("Test", "BasicPubSub", "Counter").create()?; + + let mut sample = publisher.loan()?; + + const SEND_COUNTER: u32 = 42; + sample.counter = SEND_COUNTER; + publisher.publish(sample); + + let sample_receiver = subscriber.get_sample_receiver(sample_receive_token); + + let th = thread::spawn(move || { + assert!(sample_receiver.has_data()); + + match sample_receiver.take() { + Some(sample) => assert_eq!(sample.counter, SEND_COUNTER), + _ => assert!(false, "no sample received"), + } + + sample_receiver + }); + + let sample_receiver = th.join().map_err(|_| anyhow!("could not join threads"))?; + + publisher.stop_offer(); + subscriber.unsubscribe(sample_receiver); + Ok(()) } From 23bd5490a552c2245d8e776cc4bf0dcdc9747304 Mon Sep 17 00:00:00 2001 From: Mathias Kraus Date: Thu, 30 Jun 2022 22:15:35 +0200 Subject: [PATCH 2/5] iox-#5 Add tests for loaning but not publishing --- src/tests/basic_pub_sub.rs | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/tests/basic_pub_sub.rs b/src/tests/basic_pub_sub.rs index fa1cbbf..ce08432 100644 --- a/src/tests/basic_pub_sub.rs +++ b/src/tests/basic_pub_sub.rs @@ -93,3 +93,30 @@ fn multi_threaded_subscriber() -> Result<()> { Ok(()) } + +#[test] +fn publisher_loaning_but_not_publishing_sample() -> Result<()> { + let _roudi = RouDiEnvironment::new(); + + Runtime::init("basic_pub_sub"); + + let (subscriber, sample_receive_token) = + SubscriberBuilder::::new("Test", "BasicPubSub", "Counter") + .queue_capacity(5) + .create()?; + + let publisher = PublisherBuilder::::new("Test", "BasicPubSub", "Counter").create()?; + + { + let _sample = publisher.loan()?; + } + + let sample_receiver = subscriber.get_sample_receiver(sample_receive_token); + + assert!(!sample_receiver.has_data()); + + publisher.stop_offer(); + subscriber.unsubscribe(sample_receiver); + + Ok(()) +} From 6f8465daebb2fbc71c4c574bd123669e75984835 Mon Sep 17 00:00:00 2001 From: Mathias Kraus Date: Thu, 30 Jun 2022 22:18:30 +0200 Subject: [PATCH 3/5] iox-#5 Add tests for loaning uninitialized sample --- src/tests/basic_pub_sub.rs | 38 +++++++++++++++++++++++++++++++++++++- 1 file changed, 37 insertions(+), 1 deletion(-) diff --git a/src/tests/basic_pub_sub.rs b/src/tests/basic_pub_sub.rs index ce08432..ef88473 100644 --- a/src/tests/basic_pub_sub.rs +++ b/src/tests/basic_pub_sub.rs @@ -69,7 +69,7 @@ fn multi_threaded_subscriber() -> Result<()> { let mut sample = publisher.loan()?; - const SEND_COUNTER: u32 = 42; + const SEND_COUNTER: u32 = 13; sample.counter = SEND_COUNTER; publisher.publish(sample); @@ -120,3 +120,39 @@ fn publisher_loaning_but_not_publishing_sample() -> Result<()> { Ok(()) } + +#[test] +fn loaning_uninitialized_sample() -> Result<()> { + let _roudi = RouDiEnvironment::new(); + + Runtime::init("basic_pub_sub"); + + let (subscriber, sample_receive_token) = + SubscriberBuilder::::new("Test", "BasicPubSub", "Counter") + .queue_capacity(5) + .create()?; + + let publisher = PublisherBuilder::::new("Test", "BasicPubSub", "Counter").create()?; + + const SEND_COUNTER: u32 = 73; + let mut sample = publisher.loan_uninitialized()?; + let sample = unsafe { + (*sample.as_mut_ptr()).counter = SEND_COUNTER; + sample.assume_init() + }; + publisher.publish(sample); + + let sample_receiver = subscriber.get_sample_receiver(sample_receive_token); + + assert!(sample_receiver.has_data()); + + match sample_receiver.take() { + Some(sample) => assert_eq!(sample.counter, SEND_COUNTER), + _ => return Err(anyhow!("Could not read sample")), + } + + publisher.stop_offer(); + subscriber.unsubscribe(sample_receiver); + + Ok(()) +} From df870c04cd22a4db4de89274f35b74544b1f30a5 Mon Sep 17 00:00:00 2001 From: Mathias Kraus Date: Thu, 30 Jun 2022 22:23:30 +0200 Subject: [PATCH 4/5] iox-#23 Replace 'allocate' and 'chunk' with 'loan' and 'sample' in the public API --- src/error.rs | 12 ++++++------ src/publisher.rs | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/error.rs b/src/error.rs index 5ff6633..d22eb2f 100644 --- a/src/error.rs +++ b/src/error.rs @@ -6,12 +6,12 @@ use thiserror::Error; #[derive(Error, Debug)] pub enum IceoryxError { - #[error("could not allocate chunk")] - SampleAllocationFailed, - #[error("could not create publisher")] + #[error("Could not loan sample")] + LoanSampleFailed, + #[error("Could not create publisher")] PublisherCreationFailed, - #[error("could not create subscriber")] + #[error("Could not create subscriber")] SubscriberCreationFailed, - #[error("number of allowed chunks to hold is exhausted")] - TooManyChunksHoldInParallel, + #[error("Number of allowed samples to hold is exhausted")] + TooManySamplesHoldInParallel, } diff --git a/src/publisher.rs b/src/publisher.rs index 5f56b9a..bfa9f11 100644 --- a/src/publisher.rs +++ b/src/publisher.rs @@ -131,7 +131,7 @@ impl Publisher { let mut data = self .ffi_pub .allocate_chunk::() - .ok_or(IceoryxError::SampleAllocationFailed)?; + .ok_or(IceoryxError::LoanSampleFailed)?; // TDDO use this once 'new_uninit' is stabilized // let data = Box::write(data, T::default()); @@ -151,7 +151,7 @@ impl Publisher { let data = self .ffi_pub .allocate_chunk::() - .ok_or(IceoryxError::SampleAllocationFailed)?; + .ok_or(IceoryxError::LoanSampleFailed)?; Ok(SampleMut { data: Some(data), From aeb78093600c507ac3065f938a5830c257956d18 Mon Sep 17 00:00:00 2001 From: Mathias Kraus Date: Thu, 30 Jun 2022 22:30:52 +0200 Subject: [PATCH 5/5] iox-#4 Improve wording on examples --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 5c0f4e4..dfbb812 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,9 @@ find target -type f -wholename "*/iceoryx-install/bin/iox-roudi" -exec {} \; ### Run the simple publisher and subscriber example +The `publisher_simple` and `subscriber_simple` examples are demonstrating a typical inter-process communication +use case. + A good introductory example to demonstrate the inter-process communication are `publisher_simple` and `subscriber_simple`.