8.5. Previous Releases

8.5.1. What’s New in 2.4.14

8.5.1.1. Important Interoperability Changes

8.5.1.2. DataWriter’s Default Reliability Changed to Reliable

The default reliability for a DataWriter has been changed from best-effort to reliable.

This solves interoperability problems when the remote DomainParticipant does not send the QoS value if configured with its default value. However, this may cause interoperability problems with previous releases if the former default reliability QoS is used.

8.5.1.3. Support for AUTOSAR Classic

This release includes support for Elektrobit AUTOSAR 4.0.3 and Mentor AUTOSAR 4.2.2 on Infineon AURIX TriCore TC297. Please refer to Connext Micro on AUTOSAR for details.

8.5.1.4. Support for detecting corrupted RTPS messages

This release includes support for detecting and discarding corrupted RTPS messages. A checksum is computed over the DDS RTPS message including the RTPS Header. This checksum is sent as a new RTPS submessage. The subscribing application detects this new submessage and validates the contained checksum. When a corrupted RTPS message is detected, the message is dropped.

To enable the use of a checksum in a DomainParticipant, there are three new fields in the WireProtocolQosPolicy: compute_crc, check_crc, and require_crc:

  • To send the checksum, enable compute_crc at the sending application.

  • To drop corrupted messages, enable check_crc.

  • To ignore a participant with compute_crc set to false, enable require_crc.

Please refer to Message Integrity Checking in the Connext Micro User’s Manual for details.

8.5.1.5. Port Validation for Connext Micro

After porting Connext Micro, it is important to confirm that your code works as expected. For this purpose, Connext Micro comes with a suite of tests that you can compile and run to validate your port.

8.5.1.6. New Documentation on Compiling Connext Micro for Connext Cert Compatibility

This release includes a new chapter on how to compile Connext Micro with for compatibility with Connext Cert. See Building Connext Micro with compatibility for Connext Cert.

8.5.1.7. ThreadX CMake Files and New Documentation on Building Connext Micro for ThreadX + NetX

Connext Micro libraries can now be compiled using rtime-make and CMake for ThreadX + NetX. There is a new section in the documentation on building for the ThreadX operating system and NetX network stack, including example configurations. See Building the Connext Micro Source for ThreadX.

8.5.1.8. Updated Example CMakeLists.txt to Automatically Regenerate Code when IDL or XML File Changes

The CMakeLists.txt generated by the Code Generator now has a rule that will regenerate type-support files if the IDL or XML file with the type definition changes. The rule is conditional: it is only added if the option RTIME_IDL_ADD_REGENERATE_TYPESUPPORT_RULE is set to TRUE when invoking CMake.

8.5.1.9. Message Logged when Samples Received Out of Order

This release logs an additional message when a sample is received out of order and reliability is enabled. This will occur if a reliable sample with a data submessage is received with a sequence number higher than the lowest, next expected sequence number.

8.5.1.10. Message Logged when Sequence Numbers Received More than Once

This release logs an additional message if a sample is received more than once when reliability is enabled. This means that a sample with the same sequence number has already been received.

8.5.1.11. Ability to Send Logs over UDP

This release includes support for sending logs over UDP. The destination IP address and UDP port can be configured in the AUTOSAR port properties.

8.5.1.12. rtime-make Provides Help for a Specific Target

The help output from the script rtime-make has been improved to show that is possible to get help for a specific target.

Use the command “rtime-make –target <target> –help” to print help for the target.

8.5.1.13. FreeRTOS CMake Files

The Connext Micro libraries can now be compiled using rtime-make and CMake for FreeRTOS.

8.5.1.14. Improved Documentation on Building Connext Micro for AUTOSAR Systems

The documentation on building Connext Micro for AUTOSAR systems has been improved with information about the number of resources needed. See Resources.

8.5.1.15. Examples Used Undocumented APIs

The provided examples, and those created by the Code Generator, were using Foo_create() and Foo_delete() to create and delete samples. Those APIs are not documented and should not be used. The examples have been changed to use FooTypeSupport_create_data() and FooTypeSupport_delete_data() instead.

8.5.1.16. New CMake Option to Enable Real-Time Timers on QNX and Linux Systems

Connext Micro has supported POSIX.4 real-time timers as a way to run the its internal timers. However, this feature has only been available by updating the osapi_os_posix.h header file and has been disabled by default because it relies on POSIX signals that may interfere with an application, such as if an application uses fork() and one of the exec system calls without setting the signal mask.

Connext Micro uses the signal SIGRTMIN by default. To change this, it is necessary to modify the constant OSAPISYSTEM_POSIX4_TIMER_SIGNAL at the beginning of src/osapi/posix/posixSystem.c. Please note that the number of signals available varies between systems.

To enable this feature on a QNX or Linux system, pass the following additional option to cmake or rtime-make:

8.5.1.17. New -showTemplates and -exampleTemplate options for Code Generator

This release introduces two new Code Generator command-line options, -showTemplates and -exampleTemplates.

The -showTemplates option prints and generates an XML file containing a list of available example templates in your Connext DDS installation, organized per language.

When you use the -exampleTemplate option, you can specify one of these example templates, which are in $RTIMEHOME/rtiddsgen/resource/templates/example/<language>/<templateName>/. You may also create your own templates and place them in this directory.

To use -exampleTemplates, you must also use one of the following command-line options:

  • -create examplefiles

  • -update examplefiles

  • -example

When you use the -exampleTemplates option, Code Generator will generate the example you specified, instead of the default one. For example:

rtiddsgen -language C++ -example -exampleTemplate <exampleTemplateName> foo.idl

8.5.1.18. Dynamic memory allocations removed from Dynamic Discovery Plugin

The dynamic discovery plugin in Connext Micro allocated memory dynamically for discovered topic and type names after the DomainParticipant was enabled. This release includes improvements that make it possible to avoid all memory allocations.

Dynamic memory allocations are avoided by creating the DomainParticipant in a disabled state and creating all local endpoints before the DomainParticipant is enabled. A DomainParticipant is created in a disabled state by setting

DomainParticipantFactoryQos.entity_factory.autoenable_created_entities = DDS_BOOLEAN_TRUE

before calling create_participant(). When all entities have been created, call enable() on the DomainParticipantFactory to enable all entities.

8.5.1.19. Reduced default socket send/receive buffer size for QNX systems

Some QNX kernels have a maximum send and receive socket buffer size smaller than the default value used by Connext Micro. The default send and receive socket buffer size has been changed to 64 Kbytes in Connext Micro for QNX builds.

8.5.2. What’s Fixed in 2.4.14

8.5.2.1. Small Enums Caused Serialization Errors

In previous releases, enum types that were represented internally as 1 or 2 byte values caused serialization and deserialization errors. This problem has been resolved by adding support for enum types with 1 or 2 byte internal memory representations. The wire representation for enums is unchanged at 4 bytes.

[RTI Issue ID MICRO-2249]

8.5.2.2. -Wcast-function-type and -Wdeprecated Compiler Warnings

This release fixes two different compiler warnings:

  • When compiling Connext Micro with GCC8 (or later versions) and -Wcast-function-type, the compiler printed warnings such as:

    cast between incompatible function types
    
  • When compiling Connext Micro with a C++11 compiler and -Wdeprecated, the compiler printed warnings such as:

    warning: definition of implicit copy constructor
    

Both of these issues have been fixed. Note that neither issue caused incorrect behavior.

[RTI Issue ID MICRO-2488]

8.5.2.3. Documentation did not list all Entities that Support Transport QosPolicy

The previous documentation did not list all the entities that support the DDS_TransportQosPolicy. This problem has been fixed.

The DDS entities that support the DDS_TransportQosPolicy are the DomainParticipant, DataWriter and DataReader.

[RTI Issue ID MICRO-2503]

8.5.2.4. Generated Examples Registered Wrong Type Name

The generated code for Connext Micro may have registered the wrong type name if you used the option -create examplefiles and IDL such as:

module My_Module {
   struct My_Entity {
      long id; //@key
   };
};

This generated an example that registered a type with a name that was incompatible with the type name used by other DDS tools that were configured with the same IDL file. This issue has been fixed.

[RTI Issue ID MICRO-2605]

8.5.2.5. For C++ Types Generated by rtiddsgen that have Inheritance, the ParentCclass was also Declared in the Class as Another Member

Consider the following Foo.idl file, used to generate code with rtiddsgen:

struct Base
{
     long x;
};

struct Foo: Base {
     long y;
};

This generated the following Foo.h file:

class Base
{
    long x;
};

class Foo: public Base
{
    Base parent;
    long y;
};

Note that the class Foo inherited from the class Base, and its first field was a ‘parent’ field of type ‘Base’. This should not happen, since it results in extra space being taken for each sample that will not be used.

This problem has been fixed. The generated Foo class no longer has a ‘parent’ field of type ‘Base’.

[RTI Issue ID MICRO-2633]

8.5.2.6. DomainParticipant not Rediscovered if Terminated and Restarted Before its Lease Duration Expired

A DomainParticipant was not rediscovered if it was terminated and restarted before its lease duration expired. For example, if an application with a DomainParticipant was terminated with Control-C and restarted before the DomainParticipant’s lease duration expired, the DomainParticipant would not be rediscovered. However, if the DomainParticipant was deleted with delete_participant() this problem would not occur. This issue has been resolved.

[RTI Issue ID MICRO-2672]

8.5.2.7. OSAPI_Log_clear did not Zero Out Log Buffer Memory

OSAPI_Log_clear() did not zero out the log buffer memory. This problem has been resolved. Now it will set the buffer memory to zero when it resets the buffer head.

[RTI Issue ID MICRO-2678]

8.5.2.8. Error in Generated C/C++ Code when Two Members of Different Enumerations had Same Name

The generated C/C++ code for an IDL file containing enumerations with members that had the same name would not compile. For example, consider this IDL:

module a {
     module b {
            enum Foo {
                     GREEN, RED
           }
    ;};
};
module c {
      module d {
          enum Bar {
               GREEN, YELLOW
          };
     };
};

The above IDL produced the following code:

typedef enum c_d_Foo
{
    GREEN ,
    RED
} c_d_Foo;


typedef enum c_d_Bar
{
    GREEN ,
    YELLOW
} c_d_Bar;

And it produced an error similar to this when trying to compile it:

test.h:82: error: redeclaration of enumerator ‘GREEN’
test.h:25: error: previous definition of ‘GREEN’ was here

This release introduces a new command-line option in RTI Code Generator, -qualifiedEnumerator, which allows you to generate fully qualified enumerator names. This avoids having conflicting names in C/C++.

For example, given this IDL:

module myModule{
    enum Color2 {
       GREEN,
       RED
     };

   union MyUnion switch (Color2){
     case GREEN:
            long m1;
     case RED:
             long m2;
     };
};

The following table shows the code that will be generated without the new option and with it:

Table 8.2 Effect of using -qualifiedEnumerator

Language

without -qualifiedEnumerator (default)

with -qualifiedEnumerator

C

typedef enum myModule_Color2
{
    GREEN ,
    RED
} myModule_Color2;

typedef struct myModule_MyUnion {
    myModule_Color2 _d;
    struct myModule_MyUnion_u
    {

        DDS_Long m1 ;
        DDS_Long m2 ;
    }_u;

} myModule_MyUnion ;
typedef enum myModule_Color2
{
    myModule_Color2_GREEN ,
    myModule_Color2_RED
} myModule_Color2;

typedef struct myModule_MyUnion {

    myModule_Color2 _d;
    struct myModule_MyUnion_u
    {

        DDS_Long m1 ;
        DDS_Long m2 ;
    }_u;

} myModule_MyUnion ;

C++

typedef enum myModule_Color2
{
    GREEN ,
    RED
} myModule_Color2;

typedef struct myModule_MyUnion {

    typedef struct myModule_MyUnionSeq Seq;
    ...
    myModule_Color2 _d;
    struct myModule_MyUnion_u
    {

        DDS_Long m1 ;
        DDS_Long m2 ;
    }_u;

} myModule_MyUnion ;
typedef enum myModule_Color2
{
    myModule_Color2_GREEN ,
    myModule_Color2_RED
} myModule_Color2;

typedef struct myModule_MyUnion {

    typedef struct myModule_MyUnionSeq Seq;
    ...
    myModule_Color2 _d;
    struct myModule_MyUnion_u
    {

        DDS_Long m1 ;
        DDS_Long m2 ;
    }_u;

} myModule_MyUnion ;

C++ Namespace

namespace myModule {
    typedef enum Color2
    {
        GREEN ,
        RED
    } Color2;

    typedef struct MyUnion {
        typedef struct MyUnionSeq Seq;
        ...
        myModule::Color2 _d;
        struct MyUnion_u
        {

            DDS_Long m1 ;
            DDS_Long m2 ;
        }_u;

    } MyUnion ;
};
namespace myModule {
    typedef enum Color
    {
        Color_GREEN ,
        Color_BLUE
    } Color;

    typedef struct MyUnion {
        typedef struct MyUnionSeq Seq;
        ...
        myModule::Color2 _d;
        struct MyUnion_u
        {

            DDS_Long m1 ;
            DDS_Long m2 ;
        }_u;
    } MyUnion ;
} ;

[RTI Issue ID MICRO-2718]

8.5.2.9. Incorrect Documentation Regarding Changeability of QoS

The previous release’s documentation incorrectly stated that some QoS are changeable, when they are not. This has been fixed.

The DomainParticipantFactory.EntityFactoryQosPolicy is always changeable. The following are changeable until the entity is enabled:

  • DomainParticipant.EntityFactoryQosPolicy

  • Publisher.EntityFactoryQosPolicy

  • Subscriber.EntityFactoryQosPolicy

[RTI Issue ID MICRO-2749]

8.5.2.10. Unexpected Behavior when Copying a DDS_UnsignedShortSeq with 0 Length

When copying a DDS_UnsignedShortSeq with 0 length, the destination sequence length was not set to 0. This issue has been fixed.

[RTI Issue ID MICRO-2756]

8.5.2.11. Incorrect Range Documented for DDS_ResourceLimitsQosPolicy.max_samples

The range for DDS_ResourceLimitsQosPolicy.max_samples was incorrectly documented as max_samples >= max_instances * max_samples_per_instance.

While that is correct for Connext Cert, the correct range for Connext Micro is max_samples >= max_instances.

The documentation has been corrected.

[RTI Issue ID MICRO-2757]

8.5.2.12. Wrong Compiler Option for AUTOSAR Elektrobit Platform caused ‘double’ to Compile as 4 Bytes instead of 8

CMake files include an option to optimize doubles as floats when compiling for the AUTOSAR classic Elektrobit platform. This caused the serialization and deserialization of type double to fail.

This optimization has been removed; now the size of type ‘double’ is 8 bytes when compiling for the AUTOSAR classic Elektrobit platform.

[RTI Issue ID MICRO-2823]

8.5.2.13. Log Message with Random Characters Printed

In some cases, a log message was printed with random characters. For example:

$ Alignment32 id\:000000\,sig\:06\,src\:000000\,op\:flip1\,pos\:1

[1612981807.603703999]ERROR: ModuleID=5 Errcode=20021 X=1 E=1 T=1
��hV�F��~ycV/:0/:

This issue has been resolved.

[RTI Issue ID MICRO-2877]

8.5.2.14. Event Masks of Semaphores in AUTOSAR Port were Calculated Incorrectly

Event masks of semaphores in the AUTOSAR port were calculated incorrectly. This only affected semaphore implementation and Waitsets. This issue has been resolved.

[RTI Issue ID MICRO-2953]

8.5.2.15. PUBLICATION_MATCHED_STATUS and SUBSCRIPTION_MATCHED_STATUS may never have triggered a WaitSet if the status was enabled after the DomainParticipant was enabled

A StatusCondition with PUBLICATION_MATCHED_STATUS or SUBSCRIPTION_MATCHED_STATUS enabled may never have triggered a WaitSet, if the status was enabled after the DomainParticipant was enabled.

This issue has been resolved.

[RTI Issue ID MICRO-2219]

8.5.2.16. Unicast DataReader stopped receiving samples after DataWriter matched with a multicast DataReader

A DataReader with a unicast locator stopped receiving samples from a matched DataWriter when another DataReader with a multicast locator matched with that DataWriter.

This problem has been resolved. Now all matched DataReaders will receive samples, regardless of whether their locators are unicast or multicast.

[RTI Issue ID MICRO-2369]

8.5.2.17. A RTPS max_window_size not divisible by 32 may have resulted in retransmission of wrong sequence number

An RTPS max_window_size not divisible by 32 may have caused retransmission of a sequence number not being requested. Note that the default value is divisible by 32.

This issue has been resolved.

[RTI Issue ID MICRO-2287]

8.5.2.18. POSIX mutex implementation did not conform with FACE Safety Profile

The POSIX mutex implementation did not conform with the FACE Safety Profile. This release conforms to the FACE Safety profile for single-core CPU architectures.

[RTI Issue ID MICRO-2275]

8.5.2.19. Waitset with timeout of 0 did not return immediately

A Waitset with a 0 timeout did not return immediately, but was rounded up to one clock period.

This issue has been resolved.

[RTI Issue ID MICRO-2278, MICRO-2264]

8.5.2.20. For AUTOSAR the IP address is now used to generate a unique DomainParticipant ID

In previous versions of Connext Micro for AUTOSAR the timestamp was used to generate a unique DomainParticipant ID. This release uses the IP address from the Autosar configuration by default.

[RTI Issue ID MICRO-2342]

8.5.3. What’s New in 2.4.12

8.5.3.1. Shared UDP port for discovery and user-data in a DomainParticipant

This release allows sharing a UDP port per DomainParticipant for discovery and user-traffic. The advantage is that Connext Micro will create a single receive thread for unicast instead of two.

The disadvantage is that this port mapping is not compliant with the DDS Interoperability Wire Protocol and communication with other DDS implementations might not be possible.

This feature may only be used if multicast or unicast is used for both discovery and user traffic. If both unicast and multicast are enabled this feature cannot be used.

To enable this feature assign the same value to both builtin and user port offsets in RtpsWellKnownPorts_t.

8.5.3.2. DomainParticipants no longer allocate dynamic memory during deletion

DomainParticipants will no longer allocate dynamic memory during deletion.

8.5.3.3. New QoS parameter to set maximum outstanding samples allowed for remote DataWriter

A new QoS parameter has been exposed for the endpoint discovery endpoints in the dynamic endpoint discovery plugin (DPDE). The new field, max_samples_per_remote_builtin_endpoint_writer in DPDE_DiscoveryPluginProperty, can be set to increase the number of samples a remote writer may have per builtin endpoint reader and thus decrease network traffic. Please refer to the DPDE for a description of this new parameter.

8.5.3.4. New QoS parameter to adjust preemptive ACKNACK period

A new QoS parameter has been introduced to expose the preemptive ACKNACK period on DataReaders. The new parameter is configured with:

  • DDS_DataReaderQos.protocol.rtps_reliable_reader.nack_period for user data readers

  • builtin_endpoint_reader_nack_period for the builtin discovery endpoints in the Dynamic discovery plugin

Please refer to API Reference API for details.

8.5.3.5. Deserialization of Presentation QoS policy

This release provides better support for the Presentation QoS policy. Previously this QoS policy was not supported by the DataWriter; the default value was assumed for a discovered DataReader, which caused an “Unknown QoS” warning when it was received. In this release, DataWriters will deserialize the Presentation QoS policy and check for compatibility.

8.5.4. What’s Fixed in 2.4.12

8.5.4.1. Examples used DomainParticipant_register_type instead of FooTypeSupport_register_type

In previous versions the examples registered types using “DDS_DomainParticipant_register_type()” instead of the recommended “FooTypeSupport_register_type()”. This version has updated the examples to use the recommended “FooTypeSupport_register_type()” instead.

[RTI Issue ID MICRO-1922]

8.5.4.2. A DataReader and DataWriter with incompatible liveliness kind and infinite lease_duration matched

In previous versions Connext Micro allowed a DataWriter to match a DataReader if the liveliness kind was incompatible but the liveliness duration was infinite. However, the OMG DDS specification mandates stricter matching rules and in this version a DataReader and DataWriter will only match when both the liveliness duration and kind are compatible:

  1. Requested Liveliness Lease duration is greater than or equal to the Offered lease duration.

  2. Requested Liveliness kind is less than or equal to the Offered Liveliness kind where AUTOMATIC_LIVELINESS_KIND < MANUAL_BY_PARTICIPANT_LIVELINESS_KIND < MANUAL_BY_TOPIC_LIVELINESS_KIND.

Note that this did not affect communication between Connext Micro applications since with an infinite liveliness duration, the liveliness will never expire, regardless of kind.

[RTI Issue ID MICRO-2007]

8.5.4.3. Warning at compilation time for FreeRTOS port

An incompatible pointer type warning was printed at compilation time when compiling for FreeRTOS. This issue has been resolved.

[RTI Issue ID MICRO-2090]

8.5.4.4. Using DDS_NOT_ALIVE_INSTANCE_STATE caused compilation error in C and C++

Using the constant DDS_NOT_ALIVE_INSTANCE_STATE caused a linker error due to a missing definition. This issue has been resolved.

[RTI Issue ID MICRO-2243]

8.5.4.5. Seq_copy() did not work when the source sequence is a loaned/discontiguous sequence

Calling FooSeq_copy() on a loaned or discontiguous sequence did not work correctly. This issue has been fixed.

[RTI Issue ID MICRO-2053]

8.5.4.6. Warnings when compiling the example generated by Code Generator

When compiling the example generated by rtiddsgen, the compiler may have given warnings about unused variables. The generated code has been updated to avoid these warnings.

[RTI Issue ID MICRO-1700]

8.5.4.7. Unable to generate code for XML or XSD defined types

Previous releases of Connext Micro did not include the XML and XSD schemas required to generate type-support code from XML or XSD files. This issue has been resolved.

[RTI Issue ID MICRO-1709]

8.5.4.8. Linker error in C++ application when C types were used

Compiling generated C type-support code as C++ caused compilation errors. This issue has been resolved.

[RTI Issue ID MICRO-1750]

8.5.4.10. rtiddsgen may have failed on Windows systems when -jre was specified

The rtiddsen -jre option did not accept paths with spaces. This issue has been resolved.

[RTI Issue ID MICRO-1952]

8.5.4.11. rtime-make did not work when it was started from different shell than Bash

rtime-make requires Bash on Unix systems. However it did not explicitly launch Bash and would fail if started from a Bash incompatible shell. This has been fixed.

[RTI Issue ID MICRO-2013]

8.5.4.12. Linker error when using shared libraries on VxWorks systems

There was a linker error when compiling the examples for ppc604Vx6.9gcc4.3.3 using shared libraries. The compiler reported that the libraries could not be found. This issue has been resolved.

[RTI Issue ID MICRO-1841]

8.5.4.13. A run-time error may have occurred on Windows or when compiling for FACE when using hostnames in the peer list

Due to incorrect use of the getaddrinfo() API on Windows or POSIX when compiling for FACE, a run-time error may have occured when resolving hostnames. This issue has been fixed.

[RTI Issue ID MICRO-1957]

8.5.4.14. Entity ID generation was not thread-safe

Entity ID generation for DataReaders and DataWriters was not thread-safe and may have lead to duplicate entity IDs. This problem has been resolved.

[RTI Issue ID MICRO-2104]

8.5.4.15. DomainParticipant creation failed if active interface had invalid IP

An active interface without a valid IP address assigned may have caused DomainParticipant creation to fail. This problem has been resolved. Now if an interface with an invalid IP address is used, it will be ignored and the DomainParticipant will still be created.

[RTI Issue ID MICRO-1602]

8.5.4.16. rtime-make did not work when there was a space in the installation path

The rtime-make script did not work when Connext Micro was installed in a directory path containing spaces. This issues has been resolved.

[RTI Issue ID MICRO-1622]

8.5.4.17. Sample filtering methods were always added to the subscriber code for C

The generated subscriber example code always included code to filter sample-based fields in the IDL type. However, if the generated IDL file was modified to exclude these fields, the code would fail to compile. The generated code now includes instructions for how to filter instead.

[RTI Issue ID MICRO-1980]

8.5.4.18. ‘Failure to give mutex’ error

In Connext DDS Micro 2.4.11, a subtle race condition may have occurred on multi-core machines. When this happened, an error message about failing to give a mutex would be printed: error code (EC) 44 in module 1 (OSAPI). This problem has been resolved.

[RTI Issue ID MICRO-2095]

8.5.4.19. UDP interface warning using valid interfaces

Connext DDS Micro logged a warning if no new interfaces were added for each address listed in enabled_transports. This applied to the enabled_transports field in the DiscoveryQosPolicy and UserTrafficQosPolicy in the DomainParticipantQos, and the DDS_TransportQosPolicy in the DataReaderQos and DataWriterQos. This problem has been resolved. Now Connext DDS Micro will only log a warning if no new interfaces are added per enabled transport.

[RTI Issue ID MICRO-2018]

8.5.4.20. A DataReader May Stop Receiving Samples When Filtering Callbacks Are Used

When using on_before_deserialize() or on_before_commit() to drop samples the DataReader may have been depleted of resources and stop receiving data. This issue has been fixed.

[RTI Issue ID MICRO-1930]

8.5.4.21. DDS_WaitSet_wait() returned DDS_RETCODE_ERROR if unblocked with no active conditions

An application that used a combination of polling a DataReader and blocking on a DDS_WaitSet may have caused DDS_WaitSet_wait() to return DDS_RETCODE_ERROR. This happened if the DDS_WaitSet was unblocked by an attached condition, but there were no active conditions. This problem has been resolved.

[RTI Issue ID MICRO-2115]

8.5.4.22. Large timeout values may have caused segmentation fault

Timeout values larger than 2000s may have caused a segmentation fault during creation of DDS entities. This issue has been fixed.

[RTI Issue ID MICRO-2192]

8.5.4.23. HelloWorld_dpde_waitset C++ example uses wrong loop variable for printing data

When multiple samples are loaned by calling take, the HelloWorld_dpde_waitset C++ example uses the wrong loop variable, i, with data_seq instead of the correct index b. This issue has been resolved.

[RTI Issue ID MICRO-2158]

8.5.4.24. WaitSet_wait returned generic error when returned condition sequence exceeded capacity

If the number of returned conditions exceeded the maximum size of the returned condition sequence, a generic error, DDS_RETCODE_ERROR, was returned instead of the expected error, DDS_RETCODE_OUT_OF_RESOURCES. This problem has been resolved.

[RTI Issue ID MICRO-1933]

8.5.4.25. Publication handle not set in SampleInfo structure when on_before_sample_commit() called

The publication_handle member of the DDS_SampleInfo structure passed to a DataReader’s on_before_sample_commit() function was not set. This issue has been fixed.

[RTI Issue ID MICRO-2121]

8.5.4.26. Duplicate DATA messages are sent to multicast in some cases

Duplicate DATA messages were sent to multicast when multiple DataReaders were configured with multicast and unicast receive addresses. This issue has been fixed.

[RTI Issue ID MICRO-2043]

8.5.4.27. GUID generation on QNX for processes run one after another may lead to duplicate GUIDs

On QNX systems, two processes run one after another in quick order may end up with the same GUID. The probability of GUID reuse has been reduced in this release.

[RTI Issue ID MICRO-2109]

8.5.4.28. Read/take APIs returned more than depth samples if an instance returned to alive without application reading NOT_ALIVE sample

If an instance transitioned from NOT_ALIVE_NO_WRITERS or NOT_ALIVE_DISPOSED to ALIVE and the application did not read/take the sample indicating NOT_ALIVE_NO_WRITERS or NOT_ALIVE_DISPOSED, the number of samples returned would exceed the depth set by the History QoS policy. This issue has been fixed.

[RTI Issue ID MICRO-2196]

8.5.4.29. Segmentation fault if OSAPI_Semaphore_give() was called from one thread while another called OSAPI_Semaphore_delete()

An application may have terminated with a segmentation fault if OSAPI_Semaphore_give() was called from one thread while another called OSAPI_Semaphore_delete() on Unix-like systems. This issue has been resolved.

[RTI Issue ID MICRO-2209]

8.5.4.30. Communication problems between Connext DDS Professional 6 and Connext DDS Micro 2.4.11

Connext DDS Professional 6 advertises support for RTPS protocol version 2.3, while Connext DDS Micro 2.4.11 and earlier only accepted RTPS 2.1. Therefore tools such as Admin Console 6.0.0 did not properly discover entities from a Micro 2.4.11 application. This release of Connext DDS Micro complies with RTPS 2.1 and later minor versions (such as 2.3). Unsupported RTPS messages are ignored.

[RTI Issue Id MICRO-2008]

8.5.4.31. OSAPI_System_get_ticktime() not implemented for FreeRTOS

OSAPI_System_get_ticktime() was not implemented for FreeRTOS. An application using a finite DDS deadline or liveliness would have a run-time failure. This issue has been resolved.

[RTI Issue ID MICRO-2240]

8.5.5. What’s New in 2.4.11

8.5.5.1. Support for ThreadX/NetX

Support for the ThreadX operating system, version 5.7, and the NetX TCP/IP network stack, version 5.9.

8.5.5.2. Batching (reception only)

Batching reception. Please refer to the new user’s manual UserManuals_Batching for details.

8.5.5.3. UDP Transformations

Please refer to the new user’s manual ref UserManuals_UDPTransform for details.

8.5.5.4. Optionally exclude builtin UDP Transport from compilation

Setting the flag -DRTIME_UDP_EXCLUDE_BUILTIN=1 excludes the UDP transport from being built. This setting can be useful if communication is done using only shared memory, INTRA, or a custom UDP transport.

8.5.5.5. Publication handle of DataWriter now provided upon DataReaderListener sample loss

When the DDS_DataReaderListener’s on_sample_lost event is triggered, the returned DDS_SampleLostStatus.sample_info now contains the publication_handle of the DataWriter that originally wrote the lost sample(s).

8.5.5.6. DataWriters offer TOPIC presentation

Connext Micro DataWriters now offer the DDS_TOPIC_PRESENTATION_QOS presentation (when coherent_access = FALSE). This presentation is compatible with any reader using DDS_TOPIC_PRESENTATION_QOS and DDS_INSTANCE_PRESENTATION_QOS, when ordered_access = TRUE and ordered_access = FALSE.

Micro readers will remain unchanged and will only support DDS_INSTANCE_PRESENTATION_QOS when ordered_access = FALSE.

8.5.5.7. New warning if a configured UDP transport does not have any interface

A warning in logs has been added to notify you when a configured UDP transport does not have any interface. This condition normally indicates a wrong UDP configuration, which might result in discovery and/or communication failure.

8.5.6. What’s Fixed in 2.4.11

8.5.6.1. MICRO-1814 Incorrect thread ID returned for VxWorks RTP

The function OSAPI_Thread_self() when called by a VxWorks Real-Time Process (RTP) always returned the (process) ID of the RTP, even for tasks spawned by the RTP. This issue has been fixed.

[RTI Issue ID MICRO-1814]

8.5.6.2. NULL listener and non-empty status mask not allowed for C++ DataReader

A C++ DataReader was incorrectly not allowed to be created with a NULL DataReaderListener and a non-empty status mask (i.e., not DDS_STATUS_MASK_NONE).

[RTI Issue ID MICRO-1807]

8.5.6.3. accept_unknown_peers did not work when Shared Memory transport was enabled in RTI Connext DDS Pro

When Connext Micro discovered a RTI Connext DDS Pro application with Shared Memory transport enabled, Connext Micro failed to correctly use the UDPv4 locators instead.

This issue has been fixed.

[RTI Issue ID MICRO-1798]

8.5.6.4. Calling FooSeq_set_maximum() repeatedly with the same maximum size results in seg-fault

In RTI Connext Micro 2.4.10.x and earlier, calling FooSeq_set_maximum() repeatedly with the same maximum size on an IDL sequence type containing non-primitive types (such as enums or other structures) caused a segmentation fault.

This issue has been fixed.

[RTI Issue ID MICRO-1786]

8.5.6.5. CMake reports error if CMake version 2.8.10.2 or 2.8.10.1 is used

Connext Micro buildable sources can not be compiled with CMake versions 2.8.10.1 or 2.8.10.2.

This issue has been fixed.

[RTI Issue ID MICRO-1748]

8.5.6.6. OS error code (errno) not logged if sendto() returned error

The OS error code (errno) was not correctly logged if sendto() returned an error.

This issue has been fixed.

[RTI Issue ID MICRO-1712]

8.5.6.7. Codegen might generate an incorrect pub/sub example if opction “-create typefiles” is not used

Wrong example code is generated in case rtiddsgen is executed with option -create examplefiles and option -create typefiles is NOT used.

This issue has been fixed.

[RTI Issue ID MICRO-1696]

8.5.6.8. Generated examples use always the last structure in the idl

Examples generated using Codegen use always the last structure in the idl file, even if it is not top-level.

This issue has been fixed.

[RTI Issue ID MICRO-1694]

8.5.6.9. Instance might not have been disposed or unregistered under some conditions

Unregistered or disposed samples were not processed when preceded by a GAP sub-message within the same RTPS message.

This issue has been fixed.

[RTI Issue ID MICRO-1692]

8.5.6.10. Reliable Endpoints with only multicast locators may not communicate

A reliable DataReader configured with only multicast (no unicast) locator(s) may have failed to discover or communicate with a reliable DataWriter. Both built-in discovery endpoints and user-data endpoints were affected.

This issue has been fixed.

[RTI Issue ID MICRO-1687]

8.5.6.11. Access to DDSEntity instance handles from C++ API

Users of RTI Connext DDS Micro’s C++ API can now access instance handles of any DDS entity using method DDSEntity::get_instance_handle.

[RTI Issue ID MICRO-1681]

8.5.6.12. Syntax changed for initial peer participant index range

When configuring the initial peers of a DomainParticipant (e.g. DDS_DomainParticipantQos.discovery.initial_peers), the syntax for specifying a range of participant indices for a peer locator has changed: a hyphen is now the separator, replacing a comma. In general, a peer “[x-y]@<address>” means that participant discovery messages will be sent to the address for participant indices x through y.

[RTI Issue ID MICRO-1680]

8.5.6.13. lookup_instance() is not thread safe

The lookup_instance() was not thread safe in Connext Micro 2.4.10.x and earlier. If an application was calling lookup_instance() from both a listener and a WaitSet/polling thread at the same time, the instance handle could be corrupted.

This issue has been fixed.

[RTI Issue ID MICRO-1679]

8.5.6.14. CMakeLists.txt and README.txt created when they should not

Codegen generates project files CMakeLists.txt and README.txt are generated even when project files are not generated.

This issue has been fixed.

[RTI Issue ID MICRO-1673]

8.5.6.15. No communication when DomainParticipant used same GUID as another DomainParticipant in different domain

Given an application that creates DomainParticipants in different DDS domains, a DomainParticipant created with the same Participant GUID (i.e., the GUID Prefix portion of the GUID) as created for a DomainParticipant in a different domain will fail to discover or communicate with other endpoints within its own domain. A workaround would be for the application to assign unique GUIDs for all DomainParticipants across all domains. This issue has been fixed.

This issue has been fixed.

[RTI Issue ID MICRO-1671]

8.5.6.16. Compiler error might happen when lwIP is used

An incorrectly defined compiler macro causes a compilation error when lwIP stack is used and LWIP_DNS is defined.

This issue has been fixed.

[RTI Issue ID MICRO-1664]

8.5.6.17. Wrong C++ code generated for unkeyed types when using IDL modules and -namespace option

Code generated with the following command failed if a struct with the same name was defined in two namespaces, and the first namespace did not have any key:

rtiddsgen -micro -example HelloWorld.idl -replace -language C++ -namespace

This issue has been fixed.

[RTI Issue ID MICRO-1663]

8.5.6.18. DDS_WaitSet_wait does not work if OSAPI_Semaphore_take() returns an error

DDS_WaitSet_wait does not work if OSAPI_Semaphore_take() returns an error; RETCODE_PRECONDITION_NOT_MET is always returned.

This issue has been fixed.

[RTI Issue ID MICRO-1658]

8.5.6.19. Log buffer could overflow on 64-bit architectures, causing application crash

The log buffer may have overflowed on 64-bit architectures and caused an application crash.

This issue has been fixed.

[RTI Issue ID MICRO-1657]

8.5.6.20. Fix API realloc in Windows OSAPI

Windows implementation of function realloc did not allow a NULL input pointer, this is wrong and posix implementation and Windows API allow it. This has the effect that function DDS_String_replace() fails when the input string is a NULL pointer.

This issue has been fixed.

[RTI Issue ID MICRO-1655]

8.5.6.21. New samples for an instance may not be received if an instance goes back to ALIVE when using read()

Due to an issue in the resource calculation for the DataReader, new samples for an instance may not have been received if the instance went back to ALIVE when using any of the read() APIs.

This issue has been fixed.

[RTI Issue ID MICRO-1651]

8.5.6.22. INTRA transport caused subscription matches to use additional resources

An issue in the matching between a reader and writer caused a reader to be matched with the same writer twice if auto enable was set to FALSE.

This issue has been fixed.

[RTI Issue ID MICRO-1650]

8.5.6.23. Resolved memory leak in class RTRegistry

When using previous versions of Connext Micro, C++ applications might have experienced resource leakage upon finalization of middleware resources using the method DDSDomainParticipantFactory::finalize_instance. The leaks were caused by unfreed memory blocks still owned by the class RTRegistry, and they have now been resolved. No additional action is required of users.

This issue has been fixed.

[RTI Issue ID MICRO-1637]

8.5.6.24. Windows Debug DLLs are built without debug information

Windows Debug DLLs are built without debug information what prevents debugging. This is happening when building with CMake or the rtime-make script.

This issue has been fixed.

[RTI Issue ID MICRO-1634]

8.5.6.25. Use hardcoded build ID when not compiling with CMake

When compiling using CMake or the script rtime-make, Connext Micro libraries have a build lD (buildid), which consist of the current time and date. A hardcoded constant ID is used as the build ID when compilation is not done using CMake or the script rtime-make.

This issue has been fixed.

[RTI Issue ID MICRO-1632]

8.5.6.26. Example makefiles do not support 64bit compilation

Example makefiles used always option -m32. This has been changed to use -m32 or -m64 depending on the platform configuration.

Examples can be compiled now for 32 and 64 bits platforms.

This issue has been fixed.

[RTI Issue ID MICRO-1628]

8.5.6.27. Compilation error might happen when code is generated using option -namespace

Compilation error fixed in generated source code when option -namespace is used and IDL file has modules and compilation uses shared libraries.

This issue has been fixed.

[RTI Issue ID MICRO-1620]

8.5.7. What’s New in 2.4.10.4

8.5.7.1. Batching (reception only)

This release includes batching reception. Please refer to the new user manual for Batching for details.

8.5.7.2. C++ examples

A new C++ example using Waitsets (HelloWorld_dpde_waitset) is included.

8.5.8. What’s Fixed in 2.4.10.4

8.5.8.1. Improve KEEP_LAST

To reclaim resources in version 2.4.10 and earlier the DataReader cache tries to remove the oldest sample only. If that is on loan it cannot be removed and in case a new sample is received it cannot be added to the DataReader cache.

This issue has been fixed.

[RTI Issue ID MICRO-1754]

8.5.8.2. Locator might be duplicated when NAT is configured

When Network Address Translation (NAT) is configured in the transport UDP properties, a duplicated locator might be sent in discovery packets.

This issue has been fixed.

[RTI Issue ID MICRO-1756]

8.5.8.3. Segmentation fault might happen when a DataReader cannot be created

If the creation of a DataReader fails before all fields in the DataReader structure are initialized, a NULL pointer access may have occur while finalizing the already created objects.

This issue has been fixed.

[RTI Issue ID MICRO-1755]

8.5.8.4. CMake reports error if CMake version 2.8.10.2 or 2.8.10.1 is used

RTI Connext DDS Micro buildable sources could not be compiled with CMake 2.8.10.1 or 2.8.10.2.

This issue has been fixed.

[RTI Issue ID MICRO-1748]

8.5.8.5. Wrong TUDP locator kind sent when using UDP transformations

When using UDP transformations the locator kind was always set as 0, intead of the configured value in ref UDP_InterfaceFactoryProperty.transform_locator_kind

This issue has been fixed.

[RTI Issue ID MICRO-1685]

8.5.8.6. Compile shipped examples for a 64 bits architecture

Before this release shipped examples makefiles could only compile 32 bits architectures. Makefiles have been modified to support also 64 bits architectures.

This issue has been fixed.

[RTI Issue ID MICRO-1628]

8.5.8.7. OSAPI_Heap_realloc() Windows implementation fixed

The Windows implementation of function OSAPI_Heap_realloc() had a precondition to check for a NULL pointer as input parameter. This is wrong as in this case the function shall allocate a new buffer (equivalent to malloc()).

This issue has been fixed.

[RTI Issue ID MICRO-1655]

8.5.8.8. Use API DDSDomainParticipant::delete_contained_entities() in C++ examples

Shipped C++ examples now use DDSDomainParticipant::delete_contained_entities() to delete all DSS entities in a DDS Participant. This is easier than using DDSDomainParticipant::delete_topic(), DDSDomainParticipant::unregister_type(), etc.

This issue has been fixed.

[RTI Issue ID MICRO-1656]

8.5.8.9. Memory leak in shipped examples fixed

Shipped examples were not releasing correctly some of the allocated structures when application finalized.

This issue has been fixed.

[RTI Issue ID MICRO-1676]

8.5.8.10. C++ shipped examples might release an object twice.

C++ shipped examples might release an object twice in case of error.

This issue has been fixed.

[RTI Issue ID MICRO-1677]

8.5.8.10.1. Backwards Compatability

Change in on_before_sample_deserialize callback.

In 2.4.10 and earlier the stream passed to <b>on_before_sample_deserialize</b> callback started at the encapsulation header followed by user data. However, with the added support for batched samples this is no longer possible. Instead the stream now starts at the user-data payload. Note that the only supported encapsulation format for user-data is CDR. This may change in future versions.

The examples have been updated to reflect the change. Please refer to the examples for details.

8.5.9. What’s New in 2.4.10.1

8.5.9.1. UDP Transformations

This release includes UDP Transformations which enables regular UDP sockets to be used with custom payload transformations. Please refer to ref UserManuals_UDPTransform for details. The UDP Transformation feature is enabled by default in this release. However, future releases may disable the feature by default. Thus, it is advised to always compile with the UDP Transformation feature enabled (-DRTIME_UDP_ENABLE_TRANSFORMS=1 to cmake).

NOTE: In the the EAR for 2.4.10.1 the default behavior was to allow both plain UDP and transformed UDP traffic when transformations was compiled in. This has changed. The default is to disable regular UDP. In order to support it the transform_udp_mode must be set to UDP_TRANSFORM_UDP_MODE_ENABLED. Since this may change in future release it is advised to always set the correct mode of operation.

8.5.10. What’s Fixed in 2.4.10.1

8.5.10.1. Race Condition when Log Buffer is Full and a Custom Log-handler is Installed

A race condition existed when a custom log handler was installed and the log buffer was full. A temporary message was created to hold the minimum log data and when the custom log handler was called it was possible that a new log entry was added while the custom log handler parsed the temporary message.

This has been fixed in this version.

[RTI Issue ID MICRO-1641]

8.5.11. What’s New in 2.4.10

8.5.11.1. Generate Example Application with rtiddsgen

It is now possible to generate an example application for RTI Connext Micro using rtiddsgen. To generate an example:

::

rtiddsgen -language C | C++ -micro -example <IDL File>

A CMakeLists.txt file is generated that can be used with rtime-make:

::

rtime-make [options] –srcdir <path to CMakeLists.txt>

Please refer to the generated README.txt file for details.

8.5.11.2. BY_SOURCE_TIMESTAMP_DESTINATIONORDER Support on DataWriter

The DataReader and DataWriter Qos policy now includes the DDS_DestinationOrderQosPolicy:

  • The DDS DataReader only supports BY_RECEPTION_DESTINATION_ORDER (the default value).

  • The DDS DataWriter supports BY_RECEPTION_TIMESTAMP_DESTINATION_ORDER and BY_SOURCE_TIMESTAMP_DESTINATION_ORDER.

Please refer to the DDS reference manual for details.

[RTI Issue ID MICRO-1597]

8.5.12. What’s Fixed in 2.4.10

8.5.12.1. Linker Warning for Missing PDB Files

The i86Win32VS2010 libraries shipped with Connext Micro did not include PDB files. For this reason, when compiling an application a warning similar to the following may have been shown:

::

rti_mezd.lib(BuiltinTopicData.obj) : warning LNK4099: PDB ‘dds_czd.pdb’ was not found with ‘rti_mezd.lib(BuiltinTopicData.obj)’ or at ‘<path>\dds_czd.pdb’; linking object as if no debug info

The warning was harmless and only indicates that debug information was missing for the linked libraries.

[RTI Issue ID MICRO-1556]

8.5.12.2. Linking with Dynamic Windows C Run-Time (CRT)

All shipped Connext Micro libraries for Windows platforms (static release/debug, dynamic release/debug) now link with the dynamic Windows C Run-Time (CRT). Previously, the static Connext Micro libraries statically linked the CRT.

An existing Windows project that is linking with the Connext Micro static libraries must update the RunTime Library settings.

In Visual Studio, select C/C++, Code Generation, Runtime Library, select:

  • Multi-threaded DLL (/MD) instead of Multi-threaded (/MT) for static release libraries.

  • Multi-threaded Debug DLL (/MDd) instead of Multi-threaded Debug (/MTd) for static debug libraries.

For command-line compilation, use:

  • /MD instead of /MT for static release libraries.

  • /MDd instead of /MTd for static debug libraries.

In addition, it may be necessary to ignore the static run-time libraries in their static configurations. In Visual Studio, select Linker, Input in the project properties and add libcmtd;libcmt to the ‘Ignore Specific Default Libraries’ entry.

For command-line linking, add /NODEFAULTLIB:”libcmtd” /NODEFAULTLIB:”libcmt” to the linker options.

[RTI Issue ID MICRO-1572]

8.5.12.3. DDS_Publisher_create_datawriter() May Fail to Create a New Datawriter

When an application reaches the local_writer_allocation resource limit, where subsequent calls to DDS_Publisher_create_datawriter() fail to create a new DataWriter, calling DDS_Publisher_delete_datawriter() should reclaim resources of the deleted DataWriter and allow the creation of a new DataWriter. However, in the previous release, in certain cases there was a problem with reclaiming DataWriter resources that prevented the creation of a new DataWriter.

Deleting a DataWriter or DataReader involves acknowledgements from matched applications. Thus, calling DDS_Publisher_delete_datawriter() is not an instantaneous operation so resources may not be available immediately. When this case occurs, calling DDS_Publisher_create_datawriter() after a short duration may be successful. The maximum time for a resource to be released is the maximum time a response is expected from a matched application based on the DPDE discovery plugin configuration for the built-in discovery endpoints.

[RTI Issue ID MICRO-1579]

8.5.12.4. DataReader May Not Reclaim NOT_ALIVE Instances when DataWriter Deleted or Liveliness Lost

Applications using read()/take() in on_data_available may not have received NOT_ALIVE_NO_WRITERS for instances that changed state to NOT_ALIVE_NO_WRITERS when a deleted data writer or data reader lost liveliness with a data writer caused the change. This has been fixed.

[RTI Issue ID MICRO-1580]

8.5.12.5. A Datawriter may fail to release instance resources if a peer is inactive while the Participant liveliness expires

A reliable DataWriter can mark a matched DataReader as inactive if the DataReader fails to respond to heartbeats, as configured by max_heartbeat_retries. However, if a DataReader is marked as inactive and the Participant liveliness for the DataReader’s Participant expires, a DataWriter afterwards may have failed to reclaim instances resources if unregister_instance() was called. This has been fixed.

[RTI Issue ID MICRO-1581]

8.5.12.6. A Reliable DataWriter With max_samples_per_instance = 1 May Run Out of Resources After Multiple Unregistrations of Single Instance

A reliable DataWriter with max_samples_per_instance = 1 may have run out of instance resources if the same instance is unregistered multiple times before an acknowledgement is received from a matched DataReader. This has been fixed.

[RTI Issue ID MICRO-1583]

8.5.12.7. Connext Micro Fails to Discover Endpoints created by Connext Core if the Endpoints are Deleted or Modified

If an application developed with RTI Connext Core used set_qos() on an enabled endpoint or deleted and created new endpoints before Connext Micro had discovered the deleted endpoints, Connext Micro failed to discovery new endpoints. This has been fixed.

[RTI Issue ID MICRO-1588]

8.5.12.8. Incorrect Log Output in a Complete Log Message could not be Stored

If there was insufficient space to store a complete log-message, the default display function would incorrectly try to print log-data beyond the log-buffer. This has been fixed.

[RTI Issue ID MICRO-1589]

8.5.12.9. Possible Segmentation Fault when Unregistering TRANSIENT_LOCAL Instance

Calling unregister_instance() on the same TRANSIENT_LOCAL instance may have caused a segmentation fault. The segmentation fault occured when a call to unregister_instance() is acknowledged and a later call on unregister_instance() for the same instance had not been acknowledged yet. For the segmentation fault to occur there must be more than 1 call to unregister_instance() within the history depth. This has been fixed.

[RTI Issue ID MICRO-1590]

8.5.12.10. Support to map IDL modules to C++ namespaces in generated type-plugins

The rtiddsgen included by this release will correctly generate C++ code for data types defined within IDL modules, when passed the “-namespace” argument. Consider the following IDL:

module A {
  struct Foo {
    long bar;
  };
};

module B {
  struct Foo {
    long bar;
  };
};

C++ code generated by previous releases of rtiddsgen for this IDL input would fail to build if the “-namespace” argument was used to map each IDL module to a C++ namespace.

Some of the automatically generated data types were incorrectly being exported with C linkage, effectively disabling the C++ namespaces. This would cause duplicate symbols to be detected if two types with the same name were defined in two different modules.

[RTI Issue ID MICRO-1600]

8.5.12.11. Possible Memory Access Violation when Receiving Malformed RTPS Message

When a received RTPS message had its message and submessage headers processed, Connext Micro incorrectly did not validate for all cases that there was sufficient space in the message’s receive buffer before accessing a field of a header. Consequently, reception of certain malformed messages could have resulted in memory access violations. The problem has been fixed by always validating for sufficient buffer. This has been fixed.

[RTI Issue ID MICRO-1614]

8.5.12.12. In Some Cases an Incorrect Timeout Calculation Caused 100% CPU Load

Some combinations of timeouts, clock resolution and resource-limits may have caused an incorrect timeout to be scheduled causing an infinite loop in the timer thread.

If multiple timers expires at the same time and the timeout is exactly:

::

(dp_qos.resource_limits.remote_participant_allocation + (3*dp_qos.resource_limits.local_writer_allocation) + (3*dp_qos.resource_limits.local_reader_allocation) + 1) / 2 * timer_resolution

the next timeout may be scheduled for immediate timeout, causing the timer thread to consume excessive CPU.

[RTI Issue ID MICRO-1617]

8.5.13. What’s New in 2.4.9

8.5.13.1. Improved Support for adding new Ports

Some changes were made to how Connext Micro includes different ports. In versions before 2.4.9 new ports would typically update osapi_config.h and add a new directory with an implementation for the required OSAPI functions. As of 2.4.9 osapi_config.h was re-factored and OS and compiler specific functions were moved to two new files:

  • osapi_os_<osname>.h This file contains OS specific information. RTI ships three files: osapi_os_posix.h, osapi_os_windows.h and osapi_os_vxworks.h. It is recommended to add a new osapi_os_<osname>.h file when a new OS is added.

  • osapi_cc_<osname>.h This file contains compiler specific informations. RTI ship osapi_cc_stds.c which works with Microsoft Visual Studio, clang and GCC.

Please refer to ref OSAPIUserManuals_PortingModule for details.

8.5.13.2. Updated Build Environment to Build RTI Connext Micro

Connext Micro now includes better support for adding CMake tool-chain files and also includes a better infrastructure to manage multiple builds of Connext Micro. It is strongly encouraged to read ref OSAPIUserManuals_SourceModule for details to get familiar with the new build environment.

8.5.13.3. Example CMake Tool-chain Files for Cross-Compilation

Connext Micro ships with a more cmake tool-chain files for Linux, Darwin, Windows and VxWorks. Please refer to ref OSAPIUserManuals_SourceModule for details.

[RTI Issue ID MICRO-706]

8.5.13.4. Host Bundle without the Java RunTime Available

A new smaller host bundle that does not include Java Runtime Environments (JRE) is now available for download. A host bundle with JREs included is still available.

With Java being necessary for the rtiddsgen utility, rtiddsgen now picks Java based on the following order:

  • New rtiddsgen command line option -jre

  • JREHOME environment variable

  • JAVA_HOME environment variable

  • JRE shipped with the host bundle

  • PATH environment variable

[RTI Issue ID MICRO-1520]

8.5.13.5. Support for 64-bit Platforms

Connext Micro was written for 32 bit architectures and is for all practical purposes a 32 bit application. There is no advantage to compiling Connext Micro for a 64 bit architecture and the only reason to do so is if Connext Micro must execute in a 64 bit environment for other reasons, such as other applications being 64 bit or 64 bit libraries not being available.

Connext Micro is compiled and tested on various 64 bit architectures (iOS, MacOS, Windows, Linux, VxWorks). However, when doing so the following must be kept in mind:

  • Connext Micro does not work with any data-type larger than what the transport supports and up to a maximum of 2 GB.

  • Timestamps in Connext Micro are limited to seconds encoded as a signed 32 bit integer.

8.5.13.6. POSIX Compliance Improvements

Connext Micro supports various POSIX like operating systems. Due to small differences in the implementations not all POSIX like are equal and OS specific adaptations are necessary.

As of 2.4.9 Connext Micro’s POSIX OSAPI implementation conforms to:

  • POSIX Std 1003.1, 2004 Edition (_POSIX_C_SOURCE 200112L)

  • X/Open 6 (_XOPEN_SOURCE 600)

The Connext Micro UDP transport uses ioctl calls to enable certain socket features. The required flags are in non-standard header-files on some operating system. In addition, not all POSIX-like operating systems support all the features. Connext Micro checks which OS it is compiled for by testing the presence of preprocessor flags. As of 2.4.9 Connext Micro has been built and tested on the following operating systems that supports a POSIX API (osapi_os.h):

  • Linux (_linux_)

  • Mac OS X (10.6 and later) ((_APPLE) && defined(MACH_))

  • QNX 6.x (_QNXNTO_)

  • VOS (_VOS_)

  • iOS (((_APPLE) && defined(MACH_))

  • Android (_linux_ && _ANDROID_)

NOTE: An additional compile option to enable certain non-POSIX features can be enabled to unchecking the RTIME_OSAPI_ENABLE_STRICT_POSIX option in the cmake-gui or by defining the C preprocessor flag -DOSAPI_ENABLE_STRICT_POSIX=1

8.5.13.7. C++ Support for find_topic()

The operation DDS_DomainParticipant_find_topic() is now natively supported by the C++ API as DDSDomainParticipant::find_topic().

8.5.13.8. Types Are Automatically Unregistered Upon Deleting Contained Entities

In previous releases, types must be unregistered manually from a DomainParticipant before the participant can be deleted. Now in this release, all registered types are automatically unregistered when calling DDS_DomainParticipant_delete_contained_entitites().

NOTE: It is legal to register the same type multiple times as long as it is registered with the same type-plugin. If manually unregistering a type, the type must be unregistered the same number of times as it was registered. DDS_DomainParticipant_delete_contained_entitites() ignores the number of times a type has been registered since all entities using a type are deleted first.

8.5.14. What’s Fixed in 2.4.9

8.5.14.1. Improved Documentation

The Connext Micro documentation has been improved for the following topics:

  • Compiling the Connext Micro source (ref OSAPIUserManuals_SourceModule)

  • Filtering of samples by a DDS DataReader (ref UserManuals_MicroAndCore)

  • How to use Connext Micro with RTI Recorder (ref UserManuals_MicroAndCore)

  • Compatibility between Connext Micro and other RTI Products (ref UserManuals_MicroAndCore)

[RTI Issue ID MICRO-711, MICRO-1521, MICRO-1538, MICRO-1555]

8.5.14.2. Losing Participant Liveliness Stops Communication

Previously, given a DomainParticipant “P1” whose endpoints are communicating with other endpoints belonging to other DomainParticipants, when P1 detected liveliness lost with one other DomainParticipant, communication incorrectly stopped with endpoints belonging to other DomainParticipants as well.

[RTI Issue ID MICRO-1543]

8.5.14.3. DDSTopic::narrow() Returned Incorrect Value in C++

The function lookup_topicdescription() returned a DDSTopicDescription that caused DDSTopic::narrow() to segmentation fault when this DDSTopicDescription was passed to other functions.

DDSTopic::narrow() now correctly returns a DDSTopic when passed a DDSTopicDescription found with lookup_topicdescription().

[RTI Issue ID MICRO-1544]

8.5.14.4. PRECONDITION_NOT_MET Returned by deleted_topic() When Topic Is Not Use

delete_topic() incorrectly returned PRECONDITION_NOT_MET if there where multiple references to it (for example via find_topic()). This has been corrected and delete_topic() now returns DDS_RETCODE_OK if there are multiple references, but the reference count can be decremented.

[RTI Issue ID MICRO-1545]

8.5.14.5. Instance Resources Not Reclaimed When Unregistered

When an instance is unregistered on the data writer that is best-effort with infinite deadline or using TRANSIENT_LOCAL durability, the data writer fails to free the resources being used. As a result, new instances cannot be written. This has been fixed and when an instance is unregistered all resources associated with the key is released.

[RTI Issue ID MICRO-1546]

8.5.14.6. Invalid Memory Read Reported in Log.c

Some memory profile tools reported an invalid read in Log.c. This was caused by an invalid pointer access when the log buffer was full and has been corrected.

[RTI Issue ID MICRO-1550]

8.5.14.7. Unsupported Functions When Compiling With RTI_CERT Has Been Removed From Generated Code

Code generated by rtiddsgen to support user data types has been updated to properly support compilation with the flag RTI_CERT. All unsupported operations (e.g. FooTypeSupport_delete_data) are now excluded when RTI_CERT is specified.

[RTI Issue ID MICRO-1558]

8.5.14.8. The HelloWorld_cert Example Now Compiles When Linked Against a Library Built With RTI_CERT

The HelloWorld_cert called functions that were not supported by libraries built with RTI_CERT. This has been corrected.

[RTI Issue ID MICRO-1561]

8.5.14.9. Hostnames Are No Longer Validated

Previously in Connext Micro 2.4.6, a function to validate IP hostnames as defined by RFC-952 was added and called before passing them to the OS. However, this function was too restrictive and excluded valid service names. Hostname validation is now only done directly by the OS.

[RTI Issue ID MICRO-1563]

8.5.14.10. A Participant May Not Be Rediscovered In Case Of Asymmetric Liveliness Loss

This problem was only present when using dynamic discovery.

Consider two participants A and B. In the previous release, if A lost liveliness with B, but B did not lose liveliness with A, then A did not completely rediscover B when their connection was reestablished. The problem was that since B had not lost liveliness with A, when a connection was reestablished, B thought A was already up to date on endpoint discovery. Hence, A did not rediscover the endpoints in B. This release has fixed this issue.

[RTI Issue ID MICRO-1571]

8.5.14.11. A Non-keyed Endpoint Matches a Keyed Endpoint

When performing matching between A DataReader and DataWriter the entity kind was not checked. This means a keyed DataReader would match a non-keyed DataWriter and a non-keyed DataReader would match an keyed DataWriter.

This issue would can happen if two different IDLs files are used to create DataReaders and DataWriters of the same topic and type.

Note that Connext Micro does not support type validation. If two (or more) IDLs are used to describe the same keyed type there is no check that the key-fields are the same. Thus, even with this issue resolved there are still potential pitfalls with multiple IDLs for the same type.

[RTI Issue ID MICRO-1574]

8.5.15. What’s New in 2.4.8

2.4.8 is a maintenance release with no new features.

8.5.16. What’s Fixed in 2.4.8

8.5.16.1. Consistent support for assignment operator in C++

The assignment operator for the DDS Qos, Qos policy and Status structures were not consistently supported. This has been fixed in this release as follows:

  • All QoS structures support the default generated C++ assignment operator.

  • All QoS policy structures support the default generated C++ assignment operator.

  • All Status structures support the default generated C++ assignment operator.

In addition, all QoS structures support the == and != operators.

[RTI Issue ID MICRO-1541]

8.5.16.2. DPSE API renamed to avoid conflict with assert()

The DPSE C++ API had methods called assert. However, this conflicts with the C assert() macro. This has been fixed in this release by updating the DPSE C++ API to be inline with the C API. The new API is:

class DDSCPPDllExport DPSEDiscoveryPlugin
{
public:
  static DDS_ReturnCode_t
  RemoteParticipant_assert(DDSDomainParticipant *const participant,
                           const char *rem_participant_name);

  static DDS_ReturnCode_t
  RemotePublication_assert(DDSDomainParticipant * const participant,
                           const char *const rem_participant_name,
                           const struct DDS_PublicationBuiltinTopicData *const data,
                           NDDS_TypePluginKeyKind key_kind);

  static DDS_ReturnCode_t
  RemoteSubscription_assert(DDSDomainParticipant * const participant,
                            const char *const rem_participant_name,
                            const struct DDS_SubscriptionBuiltinTopicData *const data,
                            NDDS_TypePluginKeyKind key_kind);
};

[RTI Issue ID MICRO-1539]

8.5.17. What’s New in 2.4.7

2.4.7 is a maintenance release with no new features.

8.5.18. What’s Fixed in 2.4.7

8.5.18.1. Statuses are passed as pointers instead of references to DDSDomainParticipantListeners

The statuses in the DDSDomainParticipantListener methods are now passed by reference instead of by pointer.

[RTI Issue ID MICRO-1524]

8.5.18.2. Missing assignment operator = in RT_ComponentFactoryId

The C++ API did not include the assignment operator for the RT_ComponentFactoryId type. The following assignment operators have been added:

RT_ComponentFactoryId& operator=(const char *const name);
RT_ComponentFactoryId& operator=(const RT_ComponentFactoryId& from);
const RT_ComponentFactoryId& operator=(const RT_ComponentFactoryId& from) const;

[RTI Issue ID MICRO-1525]

8.5.18.3. CMAKE_C_FLAGS_ORIGINAL in CMakeLists.txt misspelled

The CMAKE_C_FLAGS_ORIGINAL variable in the CMakeLists.txt file was misspelled causing the original C_FLAGS to be ignored. This has been corrected in this release.

[RTI Issue ID MICRO-1526]

8.5.18.4. Missing const qualifier for the sequence [] operator

The C++ API was missing the const qualifier for the sequence [] operator. This has been corrected in this release with these operators:

T& operator[] (RTI_INT32 index);
const T& operator[] (RTI_INT32 index) const;

[RTI Issue ID MICRO-1527]

8.5.18.5. Missing primitive IDL sequences in C++

The C++ API did not include sequence of the primitive IDL types. This has been corrected in this release. Please refer to ref DDSUserManuals_SequenceModule for more information about the sequence API.

[RTI Issue ID MICRO-1529]

8.5.19. What’s New in 2.4.6

8.5.19.1. Important API Changes

This version of Connext Micro includes a number of API changes to improve compatibility with rticore and make the API more robust to input argument errors such as string length violations. Please note that some of the changes are incompatible with earlier version of Connext Micro.

Changed and Incompatible APIs:

  • DDS_SEQUENCE_INITIALIZER(t) has changed to DDS_SEQUENCE_INITIALIZER. That is, the sequence element type is no longer passed in.

  • Foo_seq_get_contiguous_buffer replaces Foo_seq_get_buffer.

  • DDSTopic now uses multiple inheritance. Thus, it is no longer necessary to explicitly convert a topic to a topic description with the as_topicdescription() method when creating calling create_datareader() in C++.

  • The idref_DiscoveryComponent_name value has changed type from a char pointer to a RT_ComponentFactoryId_T type. Use ref RT_ComponentFactoryId_set_name to set the name of the discovery plugin name.

  • All C++ statuses are passed as a const reference instead of a const pointer to the listeners.

New APIs:

  • By default the full sequence API has been enabled. In previous versions only a limited subset was enabled. NOTE: For RTI_CERT the default sequence API is still the limited API.

  • The following new sequence methods have been added to the full sequence API (excluding the DDSConditionSeq):

    • ensure_length

    • to_array

    • from_array

    • operator[] in C++ is equivalent to get_reference()

    • operator= is equivalent to _copy()

    • operator== is equivalent to _is_equal()

    • operator!= is equivalent to !_is_equal()

  • The following new sequence methods have been added to the DDSConditionSeq:

    • ensure_length

    • operator[] in C++ is equivalent to get_reference()

    • operator= is equivalent to _copy()

    • operator== is equivalent to _is_equal()

    • operator!= is equivalent to !_is_equal()

  • RTIBool has been added (it is used by rticore) and is equivalent to RTI_BOOL in Connext Micro.

  • A new method idref_EntityNameQosPolicy_set_name has been added to set the idref_EntityNameQosPolicy_name field.

  • Please refer to ref rl_new_246_MICRO-1512 for new C++ APIs.

8.5.19.2. Run-time Memory Footprint Has Been Significantly Reduced

The internal representation of state information has been refactored, significantly reducing run-time memory usage.

Please refer to the ref DDSUserManuals_ResourceModule guide for details.

8.5.19.3. New FooTypeSupport operations

The FooTypeSupport code generated for a user-defined Foo data type now includes three additional operations:

  • FooTypeSupport::get_type_name

  • FooTypeSupport::create_data

  • FooTypeSupport::delete_data

These operations are available to users of both the C and C++ APIs.

8.5.19.4. All public C API now natively available to C++ users

The missing parts of RTI Connext Micro’s public C API have now been added to the public C++ API, so that C++ users don’t have to rely on C operations to implement their applications.

C++ developers are also not required to include any C header file anymore, but they must instead rely on newly available C++ header files.

Please refer to ref CPPApiModule for a list of APIs.

8.5.19.5. Status data passed by reference to C++ listeners

All callbacks exposed by the DDS listeners of the C++ API (DDSDataReaderListener, DDSDataWriterListener, DDSTopicListener, and other derived classes) now accept the status data passed in by the middleware as a C++ reference, rather than a pointer.

8.5.19.6. TheParticipantFactory now available to C++ users

The variable TheParticipantFactory is now available to users of the C++ API to reference the singleton instance of DDSDomainParticipantFactory.

8.5.19.7. Status types now available in DDS:: C++ namespace

All the status types (e.g. DDS_SubscriptionMatchedStatus) have been exposed to C++ users as part of the DDS:: namespace (e.g. DDS::SubscriptionMatchedStatus).

8.5.19.8. Foo::copy_data() takes const argument

The pointer specifying the source sample passed to the generated operation Foo::copy_data() (C++ API) is now of “const” type.

8.5.19.9. ConditionSeq added to C++ DDS namespace

C++ developers can now refer to data type DDS_ConditionSeq as DDS::ConditionSeq.

8.5.19.10. First 2-Bytes Of GUID Assigned to Vendor ID

In order to be interoperable with the Real-Time Publish-Subscribe Wire Protocol DDS Interoperability Wire Protocol (DDSI-RTPS), version 2.2, the first 2-bytes of every GUID are now automatically assigned to the OMG-specified Vendor ID.

8.5.20. What’s Fixed in 2.4.6

8.5.20.1. POSIX Threads Were Created Without Names

Previous releases on POSIX platforms created threads with no names. In this release, if thread naming is supported, a POSIX thread created with the Connext Micro OSAPI_Thread_new() function will have its thread name set.

[RTI Issue ID MICRO-638]

8.5.20.2. Prerequisite for HelloWorld_android updated in README.txt

The README.txt file for Android did not clarify that is it necessary to install the NDK tool-chain as a standalone toolchain. This has been fixed.

[RTI Issue ID MICRO-807]

8.5.20.3. CPP/HelloWorld_dpde example does not overwrite RTIMEHOME

In previous releases of Connext Micro, the CPP/HelloWorld_dpde example overwrote the RTIMEHOME environment variable, making it impossible for developers to point it to any custom value.

This error was fixed and the example can now be compiled with any valid value of RTIMEHOME.

[RTI Issue ID MICRO-834]

8.5.20.4. Transport Not Supporting Multicast Did Not Ignore Multicast

Previously, if a multicast address was specified as a discovery or user_traffic address, it was not correctly ignored by transports that did not support multicast. Consequently, an application may have failed to create a DomainParticipant. This has been fixed in this release.

[RTI Issue ID MICRO-1153]

8.5.20.5. Discovery Messages Incorrectly Dropped When Containing Non-Standard Locators

When a discovery message was received with a non-standard locator, such as for an unsupported transport, rather than just ignore the locator, the entire discovery message was discarded. This incorrect behavior prevented discovery of the entity that sent the discovery message. This issue has been fixed in this release.

[RTI Issue ID MICRO-1270]

8.5.20.6. HEARTBEAT Not Sent in Response To Initial ACKNACK

In Connext Micro, a newly matched reliable DataReader will send an initial ACKNACK submessage to the matching DataWriter in order to expedite reliable communication. The initial ACKNACK is zero-valued, and a DataWriter receiving it will not resend any samples but instead will send a HEARTBEAT that the DataReader will respond with a proper ACKNACK.

In the previous release, however, a DataWriter receiving this initial ACKNACK did not respond with a HEARTBEAT. Consequently, reliable resend of historical samples did not start as soon as it should have, and instead would start with the next HEARTBEAT sent by the DataWriter, either a periodic HEARTBEAT or a piggyback HEARTBEAT sent with newly written samples. This issue has been fixed in this release.

[RTI Issue ID MICRO-1443]

8.5.20.7. Incorrect Return Code From DataReader’s Read or Take APIs When Max_Outstanding_Reads Exceeded

When a DataReader’s read or take APIs are called, depending on the input parameters of the sample sequence and sample-info sequence, the DataReader may loan to the caller its memory containing sample and sample-info entries. A resource limit, DATA_READER_RESOURCE_LIMITS max_outstanding_reads, sets the maximum number of samples (and corresponding sample-info entries) that may be loaned.

In previous releases, when max_oustanding_reads was exceeded, the read/take APIs incorrectly returned DDS_RETCODE_NO_DATA instead of DDS_RETCODE_OUT_OF_RESOURCES. This bug has been fixed in this release.

[RTI Issue ID MICRO-1460]

8.5.20.8. DataReader Did Not Replace Historical Samples When max_samples_per_instance Equaled History Depth

Previously, given a DataReader with RESOURCE_LIMITS max_samples_per_instance equal to HISTORY depth, when the DataReader exceeded its depth (or max_samples_per_instance), it incorrectly did not replace the oldest historical sample with the newest sample. Instead, the oldest historical sample was kept in the queue, and subsequent calls to read() could return it. Note, calls to take() would remove all taken sample from the queue.

This issue has been fixed in this release.

[RTI Issue ID MICRO-1463]

8.5.20.9. A Disposed Instance Could Be Updated By A DataWriter That Is Not Its Exclusive Owner

When EXCLUSIVE_OWNERSHIP was used, a disposed instance could incorrectly be updated by a DataWriter with a lower strength than the DataWriter that disposed the instance, even if that DataWriter had not unregistered the instance. This has been corrected: when an instance is disposed, a lower strength DataWriter is not allowed to update the instance as long as the DataWriter that disposed the instance is still registered as an updater for the instance. Only when the DataWriter unregisters from the instance can a lower strength DataWriter update the instance again.

[RTI Issue ID MICRO-1464]

8.5.20.10. Fixed code generation for user-defined enum constants.

The previous version of rtiddsgen shipped with Connext Micro contained a bug which prevented the numerical constants assigned to an enum’s values to be correctly handled in the generated code.

This error has been fixed and IDL enum types are now correctly translated into C/C++ data types with the correct constants.

[RTI Issue ID MICRO-1483]

8.5.20.11. Hostname is verified as specified in RFC-952 and RFC-1123

Connext Micro relied on gethostbyname() to resolve hostnames. However, if a name resolver was not available it was possible to specify illegal names.

This has been corrected and only legal names, as defined by RFC-952 and RFC-1123, are resolved.

[RTI Issue ID MICRO-1489]

8.5.20.12. DDS_<Foo>Seq APIs Were Missing

The DDS sequence APIs for the built-in DDS types, such as DDS_LongSeq etc, were missing. The workaround was to use CDR_<Foo>Seq instead.

This issue has been corrected in this release, with the missing sequence APIs now included.

[RTI Issue ID MICRO-1493]

8.5.20.13. DataReader Could Reject All Subsequent Samples From a DataWriter

In the previous release, given a DataReader receiving samples from a DataWriter, after the DataWriter had written approximately (2^32) - max_samples_per_remote_writer number of samples, no more samples from that DataWriter would be received by the DataReader. Instead, every subsequent sample from the DataWriter would be rejected. This was caused by an incorrect update of an internal counter of the DataReader.

[RTI Issue ID MICRO-1500]

8.5.20.14. POSIX Thread Priorities Not Changeable

It was not possible to change the priority of POSIX threads created in previous releases of Connext Micro. Instead, a POSIX thread inherited the priority of its parent. This has been fixed in this release.

[RTI Issue ID MICRO-1502]

8.5.20.15. RTPS DATA Submessages with K-flag Set Were Dropped

Previously, RTPS DATA submessages with the K-flag set (indicating a serialized key payload) were not processed and instead dropped by a DataReader. This has been fixed and such DATA submessages are now processed and accepted.

[RTI Issue ID MICRO-1511]