Skip to content

Releases: eclipse-iceoryx/iceoryx2

v0.5.0

23 Dec 17:21
dfb22a3
Compare
Choose a tag to compare
v0.5.0 Pre-release
Pre-release

Full Changelog

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 and Node #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 into WaitEvent #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 to iox2_publisher_loan_slice_uninit #490
    1. C always loans slices, for a single element, specify the
      number_of_elements to be 1
  • Add APIs to C/C++ bindings to get string representation of error enum #491
    1. C API: iox2_{error_enum_name}_string(enum_value)
    2. C++ API: iox::into<const char*>(enum_value)
  • APIs to retrieve the value of UniquePortIds from the C/C++ bindings #500

API Breaking Changes

  1. Removed NodeEvent. Node::wait returns now Result<(), NodeWaitFailure>

    // old
    while node.wait(CYCLE_TIME) != NodeEvent::TerminationRequest {
     // ...
    }
    
    // new
    while node.wait(CYCLE_TIME).is_ok() {
     // ...
    }
  2. Removed payload_type_layout() from publish_subscribe::Header.

  3. Renamed max_slice_len() into initial_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

28 Sep 23:31
5f2174a
Compare
Choose a tag to compare
v0.4.1 Pre-release
Pre-release

Full Changelog

Bugfixes

  • Fix bug preventing iox2 from being executed from any location #409

Thanks To All Contributors Of This Version

v0.4.0

28 Sep 16:22
dcf26de
Compare
Choose a tag to compare
v0.4.0 Pre-release
Pre-release

Full Changelog

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
  • Introduce Nodes #102

    • Implement Serialize,Deserialize for
      • SemanticString
      • UniqueSystemId
  • Nodes register in service to enable monitoring #103

  • Multiple features from #195

    • Introduce payload_alignment in publish_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()?;
    }
  • 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
  • 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
  • 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 and create are untyped in pubsub-builder #195
  • use ClockMode::Performance instead of ClockMode::Safety in default deployment #207
  • Updated all dependencies and increased MSRV to 1.75 #221
  • Remove Service::does_exist_with_custom_config and Service::list_with_custom_config #238
  • Renamed PortFactory::{publisher|subscriber|listener|notifier} to PortFactory::{publisher|subscriber|listener|notifier}_builder #244
  • Merged Iox2::wait with new Node and removed Iox2 #270
  • Renamed zero_copy::Service and process_local::Service into ipc::Service and local::Service #323
  • Introduce SampleMutUninit<Payload> without send functionality as replacement for SampleMut<MaybeUninit<Payload>> #394

Workflow

  • Extended CLI parameters for benchmarks #360
  • Default log-level is set from LogLevel::Trace to LogLevel::Info #392

API Breaking Changes

  1. Services are created via the Node, service_builder take ServiceName 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()?;
  2. 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()?;
  3. open, open_or_create and create 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()
  4. service_name was renamed into name for consistency reasons.

    let services = ipc::Service::list()?;
    
    for service in services {
        // old
        let name = service.service_name();
    
        // new
        let name = service.name();
    }
  5. Directory entries in Config converted to type Path

    let mut config = Config::default();
    
    // old
    config.global.service.directory = "Some/Directory".into();
    
    // new
    config.global.service.directory = "Some/Directory".try_into()?;
  6. Suffix/prefix entries in Config converted to type FileName

    let mut config = Config::default();
    
    // old
    config.global.prefix = "iox2_".into();
    
    // new
    config.global.prefix = "iox2_".try_into()?;
  7. 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())?;
  8. 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())?;
  9. 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()?;
  10. 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()?;
  11. The keys ...

Read more

v0.3.0

18 Apr 15:27
a33cc28
Compare
Choose a tag to compare
v0.3.0 Pre-release
Pre-release

Full Changelog

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
  • Port UsedChunkList from iceoryx1 #129
  • From #133
    • Add Notifier|Listener|Publisher|Subscriber::id() method to acquire unique port id
    • Add Sample::origin() to determine the UniquePublisherId of the sender
  • Performance improvements, especially for AMD CPUs #136
  • Introduce lock-free mpmc BitSet #139
  • Refactor Event API #175
    • Add event_id_max_value() setting to Event 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 of EventIds to avoid infinite busy loop
  • 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 in iceoryx2-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 and spsc::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 by sysctl
    • Adjust test to handle unordered event notifications
  • 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 with iceoryx2::service::Details #100
  • Remove 'config lifetime from all structs #100
  • Remove UniqueIndex returning method from iceoryx2-bb-lock-free::mpmc::Container, cannot be implemented correctly in our context #116
  • All iceoryx2-cal::shared_memory implementations use a DynamicStorage 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 and extend_from_slice to (FixedSize)Vec #58
  • MessagingPattern implements Display #64
  • Introduce traits for all ports (Listen, Notify, Publish, DefaultLoan, UninitLoan, Subscribe)
    and for samples (PayloadMut, Payload) #69
  • Implement Ord and PartialOrd for FixedSizeByteString and ServiceName #110
  • Remove publish_subscribe::Header::time_stamp() due to ordering and performance problems #136

API Breaking Changes

  1. Use SampleMut::send() instead of Publisher::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()?;
  2. All port Publisher, Subscriber, Listener and Notifier 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> = ..;
  3. iceoryx2::service::Details no longer has a generic 'config lifetime parameter.
    iceoryx2::service::Details replaced iceoryx2::service::Service. All custom services need
    to implement iceoryx2::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 {
        // ...
    }
  4. Writing functions with generic service parameter no longer require Service + Details<'config>.
    Now it suffices to just use Service

    // 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>();
  5. 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....
Read more

v0.2.2

17 Jan 22:56
6eb0529
Compare
Choose a tag to compare
v0.2.2 Pre-release
Pre-release

Full Changelog

Bugfixes

  • Fix clock_nanosleep on macOS #80
  • Fix broken sighandler_t translation #81

Refactoring

  • Use only one config file for every platform #15

Thanks To All Contributors Of This Version

v0.2.1

09 Jan 23:01
9e5113f
Compare
Choose a tag to compare
v0.2.1 Pre-release
Pre-release

Full Changelog

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 and extend_from_slice to (FixedSize)Vec #58
  • MessagingPattern implements Display #64

Thanks To All Contributors Of This Version

v0.1.1

15 Dec 02:42
b8485d3
Compare
Choose a tag to compare
v0.1.1 Pre-release
Pre-release
  • introduce acl feature in low level posix building block to make acl support optional

v0.1.0

14 Dec 23:43
04e367f
Compare
Choose a tag to compare
v0.1.0 Pre-release
Pre-release
Merge pull request #38 from elfenpiff/iox2-2-prepare-for-announcement

[#2] Set version to 0.1.0