Releases: eclipse-iceoryx/iceoryx2
v0.8.0
Features
- Separate log crate into front-end API and backend logger implementation crates #154
- Enable Bazel
bzlmodsupport for iceoryx2 builds #355 - Android proof of concept with
localcommunication #416 - C, C++, and Python language bindings for blackboard #817
iox2 config explaincli command for config descriptions #832- Add traits to facilitate implementation of custom tunnelling mechanisms #845
- Add platform support for QNX 8 #853
- Add logger backend that uses the POSIX APIs instead of
stdto log to the console #853 - Add support for
no_stdbuilds that can be enabled by disabling the newstdfeature when buildingiceoryx2#865 - Add a C++ string container type with fixed compile-time capacity #938
- Add new C++
Expectedvocabulary data type #940 - Add a C++ vector container type with fixed compile-time capacity #951
- Use
epollinstead ofselectfor theWaitSeton Linux #961 - Configuration mechanism to for replacing vocabulary types in iceoryx2-bb-cxx with STL types #971
- Add a Rust vector type with fixed compile-time capacity which has the same memory layout as the C++ vector #1073
- Add a Rust string type with fixed compile-time capacity which has the same memory layout as the C++ vector #1075
- Add unchecked, compile time const creation functions to
SemanticStringand system types like,FileName,Path,FilePath, ... #1109 - Add conformance test suite to be able to test out-of-tree extensions #1021
- Implement
CopyforStaticString,SemanticStringand system types #1114 - Support
unionswithZeroCopySend#1144 - Add option to provide custom
iceoryx2-pal-configuration#1176 - Add option to provide custom
iceoryx2-pal-posix#1176 - Add shared memory variant based on files #1223
- Add socket directory configuration in platform #1232
- Configuration mechanism to for replacing vocabulary types in iceoryx2-bb-cxx with custom implementations #1250
Bugfixes
- Print new line after CLI output to prevent '%' from being inserted by terminal #709
- Print help for positional arguments in CLI #709
- Remove duplicate entries in
iox2command search path to prevent discovered commands from being listed multiple times #1045 - LocalService in C language binding uses IPC configuration #1059
- Trait
std::fmt::Debugis not implemented forsigset_tinlibc#1087 - Use
IOX2_SERVICE_NAME_LENGTHinServiceName::to_string()#1095 - Fix QNX cross compilation #1116
- Fix large server connection and data segment size #1130
ScopeGuardcheck ifon_dropis set before calling it #1171- Fix C binding linker error on QNX #1174
- Fix that
dev_permissionsare not applied to all resources #1188 - Fix panic during cleanup #1198
- Update urllib3 dependency to 2.6.0 (security issue in 2.5.0) #1228
- Fix incomplete cleanup of file lock based monitoring concept #1252
Refactoring
- Integrate the iceoryx_hoofs subset directly into the iceoryx2 repository #301
- Decoupled tunnel implementation from tunelling mechanism #845
- Factored out platform-specific build logic from common logic #865
- Explicitly use components from
coreandallocin all Rust code #865 - Enable -Wconversion warning for the C and C++ code #956
- Updated all dependencies and increased MSRV to 1.83 #1105
- Remove pre-compiled
noop.exeused for testing command exeuction on Windows #1133 - Support C++14 for the C++ Bindings #1167
- Remove dependency on
iceoryx2-pal-concurrency-syncin upper-level crates #1202 - Replace legacy types in public API with iceoryx2 counterparts #1234
Workflow
- Removed
iceoryx2_hoofsdependency by importing relevant files into a newiceoryx2-bb-cxxCMake package to simplify the build process. #301 - Add end-to-end tests for
iceoryx2-cli#709
New API features
- Add
list_keys()to list all keys stored in the blackboard,EntryHandle::is_up_to_date()to check for value updates #1189 - Add option to force overwrite configuration with
iox2 config generate#709
API Breaking Changes
-
Rust: Split logger frontend and backend, requiring the crate
iceoryx2_loggersto be linked to all binaries so that the logger
backend can be used by the frontend.// old use iceoryx2_bb_log::*; set_log_level(LogLevel::Info); info!("some log message") // new extern crate iceoryx2_loggers; use iceoryx2_log::*; set_log_level(LogLevel::Info); info!("some log message")
Binary crates must also include
iceoryx2_loggersas a dependency and the
default logger must be specified via feature flags. If no
feature flag is enabled, the logs are discarded. Details are documented
in theiceoryx2-loggerscrate.iceoryx2-loggers = { version = "0.7.0", features = ["std", "console"] }
-
Rust: Replaced the
FixedSizeVecwith theStaticVec// old use iceoryx2_bb_container::vec::FixedSizeVec; const VEC_CAPACITY: usize = 1234; let my_vec = FixedSizeVec::<MyType, VEC_CAPACITY>::new(); // new use iceoryx2_bb_container::vector::*; const VEC_CAPACITY: usize = 1234; let my_vec = StaticVec::<MyType, VEC_CAPACITY>::new();
-
Rust: Replaced
Vecwith thePolymorphicVec// old use iceoryx2_bb_container::vec::Vec; const VEC_CAPACITY: usize = 1234; let my_vec = Vec::<MyType>::new(); // new use iceoryx2_bb_container::vector::*; let my_stateful_allocator = acquire_allocator(); let vec_capacity: usize = 1234; let my_vec = PolymorphicVec::<MyType>::new(my_stateful_allocator, vec_capacity)?;
-
Rust: Replaced the
FixedSizeByteStringwith theStaticString// old use iceoryx2_bb_container::byte_string::FixedSizeString; const CAPACITY: usize = 1234; let my_str = FixedSizeByteString::<CAPACITY>::new(); // new use iceoryx2_bb_container::string::*; const CAPACITY: usize = 1234; let my_str = StaticString::<CAPACITY>::new();
-
C++: Remove
operator*andoperator->fromActiveRequest,
PendingResponse,RequestMut,RequestMutUninit,Response,
ResponseMut,Sample,SampleMut,SampleMutUninitsince these can
easily lead to confusion and bugs when used in combination withoptional
orexpected. Seesample.has_value()andsample->has_value()that work
on different objects.// old auto sample = publisher.loan().expect(""); sample->some_member = 123; // new auto sample = publisher.loan().expect(""); sample.payload_mut().some_member = 123;
// old auto sample =...
v0.7.0
Features
- Python language binding #419
- Tunnel over zenoh for publish-subscribe and event services #593
- Provide Official Yocto Recipe #663
- All port factories implement
Send#768 RequestResponsefor entire current discovery state #777iox2 service listenandiox2 service notify#790- Use minimal iceoryx_hoofs subset for iceoryx2 C++ bindings #824
- PubSub ports implement
Send+Sync, samples implementSendwhen using**_threadsafeservice variant #836 - ReqRes & events implement
Send+Syncin**_threadsafeservice variant #838 - Platform support for QNX 7.1 #847
- Send/receive samples with
iox2+ simple record & replay #884 - C example for service attributes #909
- Example explaining the details of service types #913
- CLI Record replay, service name is stored in record file #929
- Flatmap
removeAPI now returnsOption<T>#931 - Add script to list dependencies of multiple packages #933
- Add a C++ Optional vocabulary type for use with C++ containers #939
- Add graceful disconnect feature in client #989
- Add custom mapping offset to shared memory POSIX wrapper #1010
Bugfixes
- Fix segmentation fault in event multiplexing C example #766
- Fix lifetime in ThreadGuardedStackBuilder #770
- Fix config file load failure #772
- Make
Directory::createthread-safe #778 - Make CLI generated global config file accessible to all users #786
- Make
iox2 config showprint the available options #788 - Fix bug where CLI was not displaying positional arguments in usage help #796
- Fix startup race in
pthread_createon mac os platform #799 - CMake no longer installs unusable binaries when FetchContent is used #814
- Fix build and linker error on gcc 8 and 9 #855
- Miri complains about byte_string as_bytes* operations #875
- Make changes to the config file backward compatible #921
- Make
update_connectionspublic for all ports #923 - Fix cleanup issue of stale dynamic configs #927
- Fix memory leaks when port creation fails #947
- Clean handling of thread CPU core affinity of
posix::Thread#962 - Set thread priority correctly, not always min value #977
- Fix 32-bit data corruption issue in lock-free queues #986
- Fix provenance in bump allocator and remove implicit Sync impl #992
- Fix deadlock when system time changes and
waitis called #1000 - Improve performance of the
fillmethod ofFixedSizeVec#1006 - Fix uninitialized user header in publisher, client, active request #1014
Refactoring
- Implement
ZeroCopySendfor all system types #732 - Remove trait re-exports from iceoryx2-bb-elementary #757
- Make POSIX user- and group details optional #780
- Add
recommended::Ipcandrecommended::Localto iceoryx2 concepts for to provide link the best implementation for the specific platform #806 - Introduce newtypes for 'uid' and 'gid' #822
- Make default max event ID smaller #828
- Remove the
config/iceoryx2.tomlto reduce effort to keep the built iniceoryx.tomlandconfig.rsin sync #831 - Removed
MetaVec::is_initializedfield #900 - Enable standalone build of the C and C++ bindings #942
- Adjust visibility to
Serviceconstructs to allow customization #954 - Move C and C++ language bindings to the top level directory #963
Testing
- Create E2E Tests for all examples #730
Workflow
- Added brief cross-compile documentation #70
- Added development documentation for QNX #847
- Set up automated documentation builds for C/C++/Python hosted on GitHub Pages #920
New API features
- Add
NodeIdto sample header (to prevent loopback in tunnels) #593 - Add API to prevent self notification
Notifier::__internal_notify()#794 - Enable the usage of semaphore based events in C/C++ #795
- Remove
impl Droprestriction fromZeroCopySendtrait #908 - Introduce convenience
iceoryx2.hppheader #1016
Config Breaking Changes
-
The previously separate fields
root-path-unixandroot-path-windowshave been unified into a singleroot-pathentry in configs, located in the[global]section oficeoryx2.toml.The config file template from
config/iceoryx2.tomlwas removed and please refer toconfig/README.mdon how to generate a default config file. #831 -
The default max event ID was reduced to 255 in order to have make bitset based event implementations work out of the box. If a larger event ID is required, it can either be changed in the
iceoryx2.tomlfile or with theevent_id_max_valuein the event service builder.let event = node .service_builder(&"MyEventName".try_into()?) .event() .event_id_max_value(511) .open_or_create()?;
API Breaking Changes
-
The
iceoryx2-fficrate is renamed toiceoryx2-ffi-cdue to now also having a Python FFI package. The change should be transparent since the recommended way to use the C bindings is via theiceoryx2-ccmake package. -
The custom
UserHeader,RequestHeader,ResponseHeadermust implementDefault.
v0.6.1
v0.6.0
Features
- Full C/C++ Language bindings for all features #264
- Read LogLevel from environment variable #396
- Add Request-Response messaging pattern #429
- Lookup config file in default locations #442
- Introduce
socket_pairabstraction in POSIX wrapper #508 - Introduce
socket_pairevent concept #508 - Deadline property for event services #573
- Use 'std_instead_of_core' clippy warning #579
- Use 'std_instead_of_alloc' and 'alloc_instead_of_core' clippy warning #581
- Introduce platform abstraction based on the 'libc' crate #604
- Extend benchmarks to test setups with multiple sending/receiving ports #610
- Reduce iceoryx2 dependencies #640
- Allow customizable payload and user header type name in C++ binding #643
- Expose set_log_level_from_env* APIs to C++ #653
- Introduce a "service discovery service", which applications can subscribe and listen to for updates in service landscape #674
- Details of all service ports can be acquired #685
- Add benchmark for request-response #687
Bugfixes
- Corrupted services are removed when they are part of a dead node #458
- Remove stale shm state files in Windows #458
- Make process local services truly process local by using socket pairs for events #508
- Completion queue capacity exceeded when history > buffer #571
- Increase max supported shared memory size in Windows that restricts the maximum supported payload size #575
- Undefined behavior due to ZeroCopyConnection removal when stale resources are cleaned up #596
- Remove
SIGPOLLthat lead to compile issues on older glibc versions. Fix issue where fatal signals are generated with non-fatal values. #605 - LogLevel is considered for custom loggers. #608
- CLI argument parse failure handled gracefully, CLI help template used consistently #646
- Allow missing legal characters in system type for user- and group-name #677
- Fix
wait_and_process_once_with_timeoutdeadlock #695 - Fix Miri issues with MetaVec due to temporary borrow #682
- Do not set default log level for cargo #711
- Fix flaky windows test #739
Refactoring
- Remove the
print_system_configuration()function iniceoryx2-bb/posix/src/system_configuration.rsfile and move it into the CLIiox2-config#432 - Remove obsolete POSIX wrapper #594
- Updated all dependencies and increased MSRV to 1.81 #638
- Reduce indentation in
main.rsof CLI binaries #646 - Improve naming in
AttributeSetmethods andServiceId#697 - Implement
ZeroCopySendforStaticConfigand its nested types #707 - Efficient
CloneforFixedSizeByteString#717 - Use Rust's native endian swapping #724
- Move Traits from iceoryx2-bb-elementary to separate crate to break dependency cycles #754
New API features
- Add CLI to display complete system configuration #432
- Add simplified attribute value accessors #590
- Add CLI to launch service discovery service #674
API Breaking Changes
-
Add requirement that every payload and user header type must implement
ZeroCopySendfor type safe shared memory usage
#602// old #[repr(C)] pub struct TransmissionData { // ... } #[repr(C)] pub struct CustomHeader { // ... } let service = node .service_builder(&"ServiceName".try_into()?) .publish_subscribe::<TransmissionData>() .user_header::<CustomHeader>() .open_or_create()?; // new #[derive(ZeroCopySend)] #[repr(C)] pub struct TransmissionData { // ... } #[derive(ZeroCopySend)] #[repr(C)] pub struct CustomHeader { // ... } let service = node .service_builder(&"ServiceName".try_into()?) .publish_subscribe::<TransmissionData>() .user_header::<CustomHeader>() .open_or_create()?;
-
Renamed
PublisherLoanErrortoLoanError// old let sample = match publisher.loan() { Ok(sample) => sample, Err(PublisherLoanError::OutOfMemory) => handle_error(), // ... }; // new let sample = match publisher.loan() { Ok(sample) => sample, Err(LoanError::OutOfMemory) => handle_error(), // ... };
-
Renamed
PublisherSendErrortoSendError// old match sample.send() { Ok(n) => println!("send data to {n} subscribers"), Err(PublisherSendError::ConnectionCorrupted) => handle_error(), // ... }; // new match sample.send() { Ok(n) => println!("send data to {n} subscribers"), Err(SendError::ConnectionCorrupted) => handle_error(), // ... };
-
Renamed
SubscriberReceiveErrortoReceiveError// old match subscriber.receive() { Ok(sample) => println!("received: {:?}", *sample), Err(SubscriberReceiveError::ExceedsMaxBorrowedSamples) => handle_error(), // ... } // new match subscriber.receive() { Ok(sample) => println!("received: {:?}", *sample), Err(ReceiveError::ExceedsMaxBorrowedSamples) => handle_error(), // ... }
-
Renamed
PublisherSendError::ConnectionBrokenSincePublisherNoLongerExists
toSendError::ConnectionBrokenSinceSenderNoLongerExists -
Renamed
ConnectionFailure::UnableToMapPublishersDataSegment
toConnectionFailure::UnableToMapSendersDataSegment -
Renamed
AttributeSet::len()
toAttributeSet::number_of_attributes() -
Renamed
AttributeSet::get_key_value_len()
toAttributeSet::number_of_key_values() -
Renamed
AttributeSet::get_key_value_at()
toAttributeSet::key_value() -
Renamed
AttributeSet::get_key_values()
toAttributeSet::iter_key_values() -
Renamed
ServiceId::max_len()
toServiceId::max_number_of_characters() -
Renamed the config entry
global.service.publisher-data-segment-suffix
toglobal.service.data-segment-suffixand changed the default value to
.data. -
Methods of
ServiceNamereturn aServiceNameErrorinstead of
aSemanticStringError -
The following types no longer implement
Copy
(they only implementClone):FixedSizeByteStringSemanticStringBase64URLFileNameFilePathGroupNameUserNameServiceId
-
Renamed
AttributeVerifier::keys()toAttributeVerifier::required_keys() -
Renamed
AttributeVerifier::attributes()toAttributeVerifier::required_attributes() -
Attribute keys and values are now
SemanticStrings- All arguments of methods in
Attribute,AttributeSpecifier,
AttributeVerifier, andAttributeSetchanged from&strto
FixedSizeByteStringsthat implement theSemanticStringtrait
// old let attribute = Attribute::new("my_key", "my_value"); // new - keys or value known to fit within maximum length let attribute = Attribute::new(&"my_key".try_into().unwrap(), &"my_value".try_into().unwrap()); // new - key or value length unknown fn get_key() -> &str; fn get_value() -> &str; let key = AttributeKey::try_from(get_key()).unwrap_or_else(|e| { // Handle error: e.g., log error, use default key, or propagate error }); let value...
- All arguments of methods in
v0.5.0
Features
- C++ bindings for attributes #264
- Add Event-Multiplexer
WaitSet#390 - Add
PeriodicTimerinto POSIX building blocks #425 - Developer permissions for resources #460
- Add
--send-copyflag to Benchmark to consider mem operations #483 - Support for slices in the C++ bindings #490
- Add API to retrieve string description of error enums $491
- Add relocatable
SlotMap#504 - Add
ResizableSharedMemory#497 - Make signal handling optional in
WaitSetandNode#528 - Support dynamic data with reallocation for publish-subscribe communication #532
- Add benchmark for iceoryx2 queues #535
- Add auto event mission for create, drop and dead notifiers #550
- Introduce health monitoring example #555
- Reuse existing cargo build with C and C++ bindings #559
Bugfixes
- Split SignalHandler signals to avoid infinite loops on SIGSEGV
#436 - Fix misleading warning related to default config file
#437 - Fix infinite loop triggering in
WaitSet
#518 - Fix cmake build with iceoryx2 as submodule
#521
Refactoring
- Rename
NodeEventintoWaitEvent#390 - Bazel support for the Rust crates #349
- Remove ACL dependency #457
- Remove
max_slice_lenpublisher builder option for non-slice types #496 - Publish Subscribe Header contains number of elements contained in a
Sample#498
New API features
- APIs to support slices in the C/C++ bindings #490
- Rename
iox2_publisher_loantoiox2_publisher_loan_slice_uninit#490- C always loans slices, for a single element, specify the
number_of_elementsto be 1
- C always loans slices, for a single element, specify the
- Add APIs to C/C++ bindings to get string representation of error enum #491
- C API:
iox2_{error_enum_name}_string(enum_value) - C++ API:
iox::into<const char*>(enum_value)
- C API:
- APIs to retrieve the value of
UniquePortIdsfrom the C/C++ bindings #500
API Breaking Changes
-
Removed
NodeEvent.Node::waitreturns nowResult<(), NodeWaitFailure>// old while node.wait(CYCLE_TIME) != NodeEvent::TerminationRequest { // ... } // new while node.wait(CYCLE_TIME).is_ok() { // ... }
-
Removed
payload_type_layout()frompublish_subscribe::Header. -
Renamed
max_slice_len()intoinitial_max_slice_len().// old let publisher = service .publisher_builder() .max_slice_len(16) .create()?; // new let publisher = service .publisher_builder() .initial_max_slice_len(16) .create()?;
v0.4.1
v0.4.0
Features
-
Subscriber buffer size can be reduced #19
-
Nodes cleanup all resources of dead nodes on creation and destruction #96
-
CLI for iox2 #98
- Add
iox2CLI - Add
iox2-serviceCLI - Add
iox2-nodeCLI
- Add
-
Introduce Nodes #102
- Implement Serialize,Deserialize for
SemanticStringUniqueSystemId
- Implement Serialize,Deserialize for
-
Nodes register in service to enable monitoring #103
-
Multiple features from #195
- Introduce
payload_alignmentinpublish_subscribebuilder to increase
alignment of payload for all service samples - Introduce support for slice-types with dynamic sizes.
- Introduce
max_slice_lenin the publisher builder to set support dynamic
sized types (slices).
use iceoryx2::prelude::*; fn main() -> Result<(), Box<dyn std::error::Error>> { let node = NodeBuilder::new().create::<ipc::Service>()?; let service = node.service_builder("My/Funk/ServiceName".try_into()?) .publish_subscribe::<[usize]>() // set a custom alignment of 512, interesting for SIMD-operations .payload_alignment(Alignment::new(512).unwrap()) .open_or_create()?; let publisher = service .publisher() // defines the maximum length of a slice // can be set whenever a publisher is created to handle dynamic sized types .max_slice_len(128) .create()?; // loan some initialized memory and send it // the payload type must implement the [`core::default::Default`] trait in order to be able to use this API // we acquire a slice of length 12 let mut sample = publisher.loan_slice(12)?; sample.payload_mut()[5] = 1337; sample.send()?; }
- Introduce
-
32-bit support #200
- Introduce
IoxAtomicthat supports up to 128bit atomics on 32-bit
architecture with a ReadWriteLock - add CI targets to officially support 32-bit
- Introduce
-
Example that demonstrates publish-subscribe communication with dynamic data #205
-
Introduce
PlacementNewtrait and derive proc-macro #224 -
Custom service properties support, see example #231
- Implement Serialize,Deserialize for
FixedSizeByteStringFixedSizeVec
- Implement Serialize,Deserialize for
-
TryInto implemented for
{Node|Service}Name#243 -
Add custom user header #253
-
Build the C and C++ language bindings with bazel #329
-
Add
Subscriber::has_samples#335 -
Example that demonstrates iceoryx2 domains #370
-
Add colcon package for iceoryx2 with C/C++ bindings #381
-
Lock-free atomics on 32-bit architectures #401
Bugfixes
- Build failure for Windows 11 i686-pc-windows-msvc #235
- 'win32call' needs to provide the last error #241
- Mem-leak in
iceoryx2-bb-posix::Directory::contents()and skip empty file names #287 - Log macros do no longer return values #292
- Fix cross-compilation issue with
scandir.c#318 - Fix sample loss when publisher disconnected before subscriber called receive #337
- Service-creation-timeout is considered also for the data segment and zero copy connection #361
Refactoring
- Kebab case for config file #90
open,open_or_createandcreateare untyped in pubsub-builder #195- use
ClockMode::Performanceinstead ofClockMode::Safetyin default deployment #207 - Updated all dependencies and increased MSRV to 1.75 #221
- Remove
Service::does_exist_with_custom_configandService::list_with_custom_config#238 - Renamed
PortFactory::{publisher|subscriber|listener|notifier}toPortFactory::{publisher|subscriber|listener|notifier}_builder#244 - Merged
Iox2::waitwith newNodeand removedIox2#270 - Renamed
zero_copy::Serviceandprocess_local::Serviceintoipc::Serviceandlocal::Service#323 - Introduce
SampleMutUninit<Payload>withoutsendfunctionality as replacement forSampleMut<MaybeUninit<Payload>>#394
Workflow
- Extended CLI parameters for benchmarks #360
- Default log-level is set from
LogLevel::TracetoLogLevel::Info#392
API Breaking Changes
-
Services are created via the
Node,service_buildertakeServiceNameby
value// old let service = zero_copy::Service::new(&service_name) .event() .create()?; // new let node = NodeBuilder::new().create::<ipc::Service>()?; let service = node.service_builder(service_name) // service_name is moved into builder .event() .create()?;
-
Custom configurations are added to the
Node. Methods
{event|publish_subscribe}_with_custom_configare removed// old let service = zero_copy::Service::new(&service_name) .publish_subscribe_with_custom_config::<u64>(&custom_config) .open_or_create()?; // new let node = NodeBuilder::new() .config(&custom_config) .create::<ipc::Service>()?; let service = node.service_builder(service_name) .publish_subscribe::<u64>() .open_or_create()?;
-
open,open_or_createandcreateare untyped for publish-subscribe
services// old let service = zero_copy::Service::new(&service_name) .publish_subscribe() .create::<u64>()?; // or open::<u64>(), or open_or_create::<u64>() // new let node = NodeBuilder::new().create::<ipc::Service>()?; let service = node.service_builder(service_name) .publish_subscribe::<u64>() // type is now up here .create()?; // or open(), or open_or_create()
-
service_namewas renamed intonamefor consistency reasons.let services = ipc::Service::list()?; for service in services { // old let name = service.service_name(); // new let name = service.name(); }
-
Directory entries in
Configconverted to typePathlet mut config = Config::default(); // old config.global.service.directory = "Some/Directory".into(); // new config.global.service.directory = "Some/Directory".try_into()?;
-
Suffix/prefix entries in
Configconverted to typeFileNamelet mut config = Config::default(); // old config.global.prefix = "iox2_".into(); // new config.global.prefix = "iox2_".try_into()?;
-
Service::list_with_custom_configwas removed.// old let services = zero_copy::Service::list()?; let services = zero_copy::Service::list_with_custom_config(Config::global_config())?; // new let services = ipc::Service::list(Config::global_config())?;
-
Service::does_exist_with_custom_configwas removed.// old let services = zero_copy::Service::does_exist(service_name)?; let services = zero_copy::Service::does_exist_with_custom_config(service_name, Config::global_config())?; // new let services = ipc::Service::does_exist(service_name, Config::global_config())?;
-
Creating pub-sub ports with
service.{publisher|subscriber}_builder().// old let publisher = service.publisher().create()?; let subscriber = service.subscriber().create()?; // new let publisher = service.publisher_builder().create()?; let subscriber = service.subscriber_builder().create()?;
-
Creating event ports with
service.{listener|notifier}_builder().// old let listener = service.listener().create()?; let notifier = service.notifier().create()?; // new let listener = service.listener_builder().create()?; let notifier = service.notifier_builder().create()?;
-
The keys ...
v0.3.0
Features
- Add docker example #83
- Introduce
iceoryx2-bb-posix::process_statefor process monitoring #96 - Introduce concept
iceoryx2-cal::monitoring#96 - New constructs from #123
- Introduce semantic string
iceoryx2-bb-system-types::base64url - Introduce
iceoryx2-cal::hash::HashValuethat contains the result of a hash
- Introduce semantic string
- Port
UsedChunkListfrom iceoryx1 #129 - From #133
- Add
Notifier|Listener|Publisher|Subscriber::id()method to acquire unique port id - Add
Sample::origin()to determine theUniquePublisherIdof the sender
- Add
- Performance improvements, especially for AMD CPUs #136
- Introduce lock-free mpmc BitSet #139
- Refactor Event API #175
- Add
event_id_max_value()setting toEventservice builder - Add
defaults.event.event_id_max_valueto config file (iceoryx2.toml) - Add
Listener::{try|timed|blocking}_wait_allto grab a batch ofEventIdsto avoid infinite busy loop
- Add
- Example for complex data types #175
Bugfixes
- Fix undefined behavior in
spsc::{queue|index_queue}#87 - Fix
open_or_createrace #108 - Fixes for #116
- Fix retrieve channel overflow caused by big publisher loans
- Fix
CreationMode::OpenOrCreateiniceoryx2-bb-posix::SharedMemory - Add missing memory synchronization to posix shm zero copy connection
- Remove retrieve buffer full check from zero copy connection - sender had insufficient infos available
- Fix data race in
iceoryx2-bb-lock-free::mpmc::Container
- Fix insufficient memory reordering protection in
spsc::Queue::pushandspsc::Queue::pop#119 - Fix data race due to operation reordering in
spmc::UnrestrictedAtomic::load#125 - Fix broken
Publisher|Subscriber::populate_{subscriber|publisher}_channels()#129 - Fix failing reacquire of delivered samples in the zero copy receive channel #130
- Fix receiving of invalid samples when subscriber is connected #131
- Fix problem where sample is released to the wrong publisher #133
- Fix event notifier deadlock with reconnecting listeners #139
- Fixes for FreeBSD 14.0 #140
- Fix segfault in
iceoryx2-pal-posix;:shm_list()caused bysysctl - Adjust test to handle unordered event notifications
- Fix segfault in
- Fix non UTF-8 windows platform error messages #145
- Correct inconsistent default config entries for windows #149
- Fix that drop is not called when DynamicStorage is destroyed #160
- Fix race in
UniqueSystemIdthat leads to non-unique unique ids #181
Refactoring
- Replace
iceoryx2::service::Servicewithiceoryx2::service::Details#100 - Remove
'configlifetime from all structs #100 - Remove
UniqueIndexreturning method fromiceoryx2-bb-lock-free::mpmc::Container, cannot be implemented correctly in our context #116 - All
iceoryx2-cal::shared_memoryimplementations use aDynamicStorageconcept as base #153 - Hardening DynamicStorage, storages with distinct types cannot be opened #160
- IpcCapable handles explicity destroy underlying object in drop, instead of ref counting #162
New API features
- Add
FixedSizeByteString::from_bytes_truncated#56 - Add
Deref,DerefMut,Clone,Eq,PartialEqandextend_from_sliceto (FixedSize)Vec #58 MessagingPatternimplementsDisplay#64- Introduce traits for all ports (
Listen,Notify,Publish,DefaultLoan,UninitLoan,Subscribe)
and for samples (PayloadMut,Payload) #69 - Implement
OrdandPartialOrdforFixedSizeByteStringandServiceName#110 - Remove
publish_subscribe::Header::time_stamp()due to ordering and performance problems #136
API Breaking Changes
-
Use
SampleMut::send()instead ofPublisher::send()// old let publisher = service.publisher().create()?; let sample = publisher.loan()?; // set sample value publisher.send(sample)?; // new let publisher = service.publisher().create()?; let sample = publisher.loan()?; // set sample value sample.send()?;
-
All port
Publisher,Subscriber,ListenerandNotifierno longer have a generic
'configlifetime parameter.// old let publisher: Publisher<'service, 'config, iceoryx2::service::zero_copy::Service::Type<'config>, MessageType> = ..; let subscriber: Subscriber<'service, 'config, iceoryx2::service::zero_copy::Service::Type<'config>, MessageType> = ..; let notifier: Notifier<'service, 'config, iceoryx2::service::zero_copy::Service::Type<'config>> = ..; let listener: Listener<'service, 'config, iceoryx2::service::zero_copy::Service::Type<'config>> = ..; // new let publisher: Publisher<'service, iceoryx2::service::zero_copy::Service, MessageType> = ..; let subscriber: Subscriber<'service, iceoryx2::service::zero_copy::Service, MessageType> = ..; let notifier: Notifier<'service, iceoryx2::service::zero_copy::Service> = ..; let listener: Listener<'service, iceoryx2::service::zero_copy::Service> = ..;
-
iceoryx2::service::Detailsno longer has a generic'configlifetime parameter.
iceoryx2::service::Detailsreplacediceoryx2::service::Service. All custom services need
to implementiceoryx2::service::Service.// old pub struct MyCustomServiceType<'config> { state: ServiceState<'config, static_storage::whatever::Storage, dynamic_storage::whatever::Storage<WhateverConfig>> } impl<'config> crate::service::Service for MyCustomServiceType<'config> { // ... } impl<'config> crate::service::Details for MyCustomServiceType<'config> { // ... } // new pub struct MyCustomServiceType { state: ServiceState<static_storage::whatever::Storage, dynamic_storage::whatever::Storage<WhateverConfig>> } impl crate::service::Service for MyCustomServiceType { // ... }
-
Writing functions with generic service parameter no longer require
Service + Details<'config>.
Now it suffices to just useService// old fn my_generic_service_function<'config, ServiceType: iceoryx2::service::Service + iceoryx2::service::Details<'config>>(); // new fn my_generic_service_function<ServiceType: iceoryx2::service::Service>();
-
Do not use
Header::time_stamp(), when required make it part of the payload
type. Be aware, this can be expensive and can lead to a significantly increased latency!// old let subscriber = service.subscriber().create()?; println!("sample timestamp: {:?}", sample.unwrap().header().time_stamp()); // new use iceoryx2_bb_posix::clock::{Time, TimeBuilder}; #[derive(Debug)] #[repr(C)] pub struct TimeStamp { seconds: u64, nanoseconds: u32, } impl TimeStamp { pub fn new() -> Self { let now = Time::now().unwrap(); Self { seconds: now.seconds(), nanoseconds: now.nanoseconds(), } } } pub struct MyMessageType { payload: u64, time_stamp: TimeStamp } // sender side let publisher = service....
v0.2.2
Bugfixes
Refactoring
- Use only one config file for every platform #15
Thanks To All Contributors Of This Version
v0.2.1
Features
- MacOS Platform support #51
- Services with the same name for different messaging patterns are supported #16
Bugfixes
- Fix undefined behavior in
FixedSizeByteString::new_unchecked#61 - Fix suffix of static config #66
- Interpret non-existing service directory as no existing services #63
Refactoring
- Rename char in platform to c_char #54
- Set reasonable rust min version to 1.70 and verify it with additional CI targets #72
Workflow
- add
cargo auditfor security vulnerability checking in dependencies #48
New API features
- Add
FixedSizeByteString::from_bytes_truncated#56 - Add
Deref,DerefMut,Clone,Eq,PartialEqandextend_from_sliceto (FixedSize)Vec #58 MessagingPatternimplementsDisplay#64