Releases: eclipse-iceoryx/iceoryx2
v0.5.0
Features
- C++ bindings for attributes #264
- Add Event-Multiplexer
WaitSet
#390 - Add
PeriodicTimer
into POSIX building blocks #425 - Developer permissions for resources #460
- Add
--send-copy
flag 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
WaitSet
andNode
#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
NodeEvent
intoWaitEvent
#390 - Bazel support for the Rust crates #349
- Remove ACL dependency #457
- Remove
max_slice_len
publisher 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_loan
toiox2_publisher_loan_slice_uninit
#490- C always loans slices, for a single element, specify the
number_of_elements
to 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
UniquePortIds
from the C/C++ bindings #500
API Breaking Changes
-
Removed
NodeEvent
.Node::wait
returns 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
iox2
CLI - Add
iox2-service
CLI - Add
iox2-node
CLI
- Add
-
Introduce Nodes #102
- Implement Serialize,Deserialize for
SemanticString
UniqueSystemId
- Implement Serialize,Deserialize for
-
Nodes register in service to enable monitoring #103
-
Multiple features from #195
- Introduce
payload_alignment
inpublish_subscribe
builder to increase
alignment of payload for all service samples - Introduce support for slice-types with dynamic sizes.
- Introduce
max_slice_len
in 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
IoxAtomic
that 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
PlacementNew
trait and derive proc-macro #224 -
Custom service properties support, see example #231
- Implement Serialize,Deserialize for
FixedSizeByteString
FixedSizeVec
- 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_create
andcreate
are untyped in pubsub-builder #195- use
ClockMode::Performance
instead ofClockMode::Safety
in default deployment #207 - Updated all dependencies and increased MSRV to 1.75 #221
- Remove
Service::does_exist_with_custom_config
andService::list_with_custom_config
#238 - Renamed
PortFactory::{publisher|subscriber|listener|notifier}
toPortFactory::{publisher|subscriber|listener|notifier}_builder
#244 - Merged
Iox2::wait
with newNode
and removedIox2
#270 - Renamed
zero_copy::Service
andprocess_local::Service
intoipc::Service
andlocal::Service
#323 - Introduce
SampleMutUninit<Payload>
withoutsend
functionality as replacement forSampleMut<MaybeUninit<Payload>>
#394
Workflow
- Extended CLI parameters for benchmarks #360
- Default log-level is set from
LogLevel::Trace
toLogLevel::Info
#392
API Breaking Changes
-
Services are created via the
Node
,service_builder
takeServiceName
by
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_config
are 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_create
andcreate
are 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_name
was renamed intoname
for 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
Config
converted to typePath
let 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
Config
converted to typeFileName
let mut config = Config::default(); // old config.global.prefix = "iox2_".into(); // new config.global.prefix = "iox2_".try_into()?;
-
Service::list_with_custom_config
was 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_config
was 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_state
for 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::HashValue
that contains the result of a hash
- Introduce semantic string
- Port
UsedChunkList
from iceoryx1 #129 - From #133
- Add
Notifier|Listener|Publisher|Subscriber::id()
method to acquire unique port id - Add
Sample::origin()
to determine theUniquePublisherId
of 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 toEvent
service builder - Add
defaults.event.event_id_max_value
to config file (iceoryx2.toml
) - Add
Listener::{try|timed|blocking}_wait_all
to grab a batch ofEventIds
to avoid infinite busy loop
- Add
- Example for complex data types #175
Bugfixes
- Fix undefined behavior in
spsc::{queue|index_queue}
#87 - Fix
open_or_create
race #108 - Fixes for #116
- Fix retrieve channel overflow caused by big publisher loans
- Fix
CreationMode::OpenOrCreate
iniceoryx2-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::push
andspsc::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
UniqueSystemId
that leads to non-unique unique ids #181
Refactoring
- Replace
iceoryx2::service::Service
withiceoryx2::service::Details
#100 - Remove
'config
lifetime from all structs #100 - Remove
UniqueIndex
returning method fromiceoryx2-bb-lock-free::mpmc::Container
, cannot be implemented correctly in our context #116 - All
iceoryx2-cal::shared_memory
implementations use aDynamicStorage
concept 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
,PartialEq
andextend_from_slice
to (FixedSize)Vec #58 MessagingPattern
implementsDisplay
#64- Introduce traits for all ports (
Listen
,Notify
,Publish
,DefaultLoan
,UninitLoan
,Subscribe
)
and for samples (PayloadMut
,Payload
) #69 - Implement
Ord
andPartialOrd
forFixedSizeByteString
andServiceName
#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
,Listener
andNotifier
no longer have a generic
'config
lifetime 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::Details
no longer has a generic'config
lifetime parameter.
iceoryx2::service::Details
replacediceoryx2::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 audit
for security vulnerability checking in dependencies #48
New API features
- Add
FixedSizeByteString::from_bytes_truncated
#56 - Add
Deref
,DerefMut
,Clone
,Eq
,PartialEq
andextend_from_slice
to (FixedSize)Vec #58 MessagingPattern
implementsDisplay
#64