3.4.2.1. RTI Connext Core Libraries
The following issues affect backward compatibility in the Core Libraries starting in Release 6.0.0. Issues in the Core Libraries may affect components that use these libraries, including services and tools.
3.4.2.1.1. APIs
The following Application Program Interfaces (APIs) have been changed or deprecated in 6.0.0. For new APIs, see What’s New in 6.0.0.
3.4.2.1.1.1. Wchar and wstring language binding changes
See information about this change in Section 3.4.1.3.5.
3.4.2.1.1.2. Dynamic Data compatibility issues
3.4.2.1.1.2.1. Deprecated APIs
In 6.0.0, the DynamicData::set_buffer
and
DynamicData::get_estimated_max_buffer_size
APIs have been deprecated.
If you were using these APIs to get a CDR of the DynamicData
object,
then DynamicData::to_cdr_buffer
should be used for that instead.
3.4.2.1.1.2.2. Unsupported members
Starting in 6.0.0, the following members in the DynamicDataTypeSerializationProperty_t
are no longer supported:
use_42e_compatible_alignment
(see Section 3.4.1.1.4)
max_size_serialized
min_size_serialized
The size of the DynamicData
buffers in the DataReader’s queue are now
controlled by the fields buffer_initial_size
and buffer_max_size
in the DynamicDataTypeProperty_t::data
field.
It is no longer required to set anything in the DynamicDataTypeProperty_t
in order to support unbounded types for a DynamicData
DataReader.
The default behavior for a DynamicData
DataReader is that samples are
allocated to the minimum deserialized size and can grow to any size
required to store incoming samples.
3.4.2.1.1.3. Changes in memory management for flow_controller_name and filter_name fields in DataWriterQos for C and traditional C++
In 6.0.0, a memory leak may occur when you programmatically modify the
flow_controller_name
or filter_name
QoS values, overwriting them with new
values. The problem only
occurs when the QoS values contain the names of builtin flow controllers or
filters. In previous releases, builtin flow controllers or filters were constants,
and they did not have to be deleted. In 6.0.0, the builtin flow controllers and
filters are regular strings, and you must use the DDS_String_free()
method
to free the flow_controller_name
or filter_name
before before assigning
a new value.
See the C or Traditional C++ API Reference HTML
documentation in release 6.1.0 for further details on how to handle the
flow_controller_name
and filter_name
fields to avoid crashes and memory leaks.
[RTI Issue ID CORE-9448]
3.4.2.1.2. Generated Code
3.4.2.1.2.1. Changed modern C++ default IDL mapping
In 5.3.0, a new option, -stl
, was introduced to change the mapping
of some of the IDL types, when combined with -language C++03
or
-language C++11
. From 6.0.0 onward, -stl
is the default
option when generating code for C++03/C++11. A new option, -legacyPlugin
,
has been introduced to generate code using the old mapping.
Starting in 6.0.0, the following IDL types have the following default mapping:
Unbounded sequences map to
std::vector
(when-unboundedSupport
is also specified)Bounded sequences map to
rti::core::bounded_sequence<T, Bound>
, unless the sequence member has the annotation@use_vector
or rtiddsgen is run with the command-line option-alwaysUseStdVector
, in which case they also map tostd::vector
.Strings map to
std::string
.Wide strings map to
std::wstring
, wide characters map towchar_t
.Members with the new annotation
@external
(equivalent to the * pointer notation) map to the typedds::core::external<T>
, a type similar toshared_ptr
(see the API Reference HTML documentation for more details).
For example, consider the following IDL type:
struct MyType {
sequence<long> my_unbounded_seq;
sequence<long, 10> my_bounded_seq;
@use_vector sequence<long, 10> my_other_bounded_seq
string my_str;
@external long my_external;
};
This is how the generated C++11 type looks starting in 6.0.0:
rtiddsgen -language C++11 -unboundedSupport MyType.idl
class MyType {
public:
MyType();
MyType(const std::vector<int32_t>& my_unbounded_seq,
const rti::core::bounded_sequence<int32_t,
10>& my_bounded_seq,
const std::vector<int32_t>& my_other_bounded_seq,
const std::string& my_str,
dds::core::external<int32_t> my_external);
MyType (MyType&&) = default;
MyType& operator=(MyType&&) = default;
MyType& operator=(const MyType&) = default;
MyType(const MyType&) = default;
std::vector<int32_t>& my_unbounded_seq() noexcept;
const std::vector<int32_t>& my_unbounded_seq() const noexcept;
void my_unbounded_seq(const std::vector<int32_t>& value);
rti::core::bounded_sequence<int32_t, 10>& my_bounded_seq() noexcept;
const rti::core::bounded_sequence<int32_t, 10>& my_bounded_seq() const noexcept;
void my_bounded_seq(const rti::core::bounded_sequence<int32_t, 10>& value);
std::vector<int32_t>& my_other_bounded_seq() noexcept;
const std::vector<int32_t>& my_other_bounded_seq() const noexcept;
void my_other_bounded_seq(const std::vector<int32_t>& value);
std::string& my_str() noexcept;
const std::string& my_str() const noexcept;
void my_str(const std::string& value);
dds::core::external<int32_t>& my_external() noexcept;
const dds::core::external<int32_t>& my_external() const noexcept;
void my_external(dds::core::external<int32_t> value);
bool operator == (const MyType& other_) const;
bool operator != (const MyType& other_) const;
void swap(MyType& other_) noexcept ;
};
If you want to generate code using the old mapping, enter the following:
rtiddsgen -language C++11 -legacyPlugin -unboundedSupport MyType.idl
class MyType {
public:
MyType();
MyType(
const dds::core::vector<int32_t>& my_unbounded_seq_param,
const dds::core::vector<int32_t>& my_bounded_seq_param,
const dds::core::vector<int32_t>& my_other_bounded_seq_param,
const dds::core::string& my_str_param,
int32_t * my_external_param);
MyType (MyType&&) = default;
MyType& operator=(MyType&&) = default;
MyType& operator=(const MyType&) = default;
MyType(const MyType&) = default;
dds::core::vector<int32_t>& my_unbounded_seq() noexcept;
const dds::core::vector<int32_t>& my_unbounded_seq() const noexcept;
void my_unbounded_seq(const dds::core::vector<int32_t>& value);
dds::core::vector<int32_t>& my_bounded_seq() noexcept;
const dds::core::vector<int32_t>& my_bounded_seq() const noexcept;
void my_bounded_seq(const dds::core::vector<int32_t>& value);
dds::core::vector<int32_t>& my_other_bounded_seq() noexcept;
const dds::core::vector<int32_t>& my_other_bounded_seq() const noexcept;
void my_other_bounded_seq(const dds::core::vector<int32_t>& value);
dds::core::string& my_str() noexcept;
const dds::core::string& my_str() const noexcept;
void my_str(const dds::core::string& value);
int32_t * my_external() const noexcept;
void my_external(int32_t * value);
bool operator == (const MyType& other_) const;
bool operator != (const MyType& other_) const;
void swap(MyType& other_) noexcept;
};
3.4.2.1.3. QoS
3.4.2.1.3.1. Properties dds.type_consistency.ignore_member_names and dds.type_consistency.ignore_sequence_bounds have been deprecated
In 6.0.0, the QoS properties dds.type_consistency.ignore_member_names
and dds.type_consistency.ignore_sequence_bounds
have been deprecated.
The properties are still supported for backward compatibility reasons,
but future releases may stop supporting them.
The functionality provided by these properties is provided in the
TYPE_CONSISTENCY_ENFORCEMENT
QosPolicy, which is part of the
(DDS-XTypes) specification from the Object Management Group (OMG).
dds.type_consistency.ignore_member_names
has been replaced with the
standard reader_qos.type_consistency.ignore_member_names
and
reader_qos.type_consistency.ignore_enum_literal_names
.
If you were setting the property dds.type_consistency.ignore_member_names
to “true,” you must now set both
reader_qos.type_consistency.ignore_member_names
and
reader_qos.type_consistency.ignore_enum_literal_names
to true to
preserve the same behavior.
dds.type_consistency.ignore_sequence_bounds
has been replaced with the
standard reader_qos.type_consistency.ignore_sequence_bounds
and
reader_qos.type_consistency.ignore_string_bounds
. If you were setting
the property dds.type_consistency.ignore_sequence_bounds
to “true,”
you must now set both reader_qos.type_consistency.ignore_sequence_bounds
and reader_qos.type_consistency.ignore_string_bounds
to true to
preserve the same behavior.
For additional information, see the RTI Connext DDS Core Libraries Getting Started Guide Addendum for Extensible Types.
3.4.2.1.4. Library Size
In 6.0.0, the size of the libraries increases compared to 5.3.1, due to the addition of a significant amount of functionality. The following table shows the differences:
5.3.1 |
6.0.0 |
Change (%) |
|
---|---|---|---|
libnddscpp.so |
1.42 |
1.49 |
+5 |
libnddscpp2.so |
0.93 |
0.96 |
+3 |
libnddsc.so |
5.3 |
5.86 |
+10 |
libnddscore.so |
5.63 |
6.07 |
+7 |
3.4.2.1.5. Memory Consumption
In general, 6.0.0 applications will consume more heap memory than 5.3.1 applications. Stack size is similar between the two releases; there are no significant changes in the stack size.
The following table shows the heap memory differences:
5.3.1 |
6.0.0 |
Change (%) |
|
---|---|---|---|
Participant |
1936149 |
1946776 |
+0.55 |
Type |
1492 |
1610 |
+7.91 |
Topic |
2090 |
2187 |
+4.64 |
Subscriber |
14356 |
14798 |
+3.08 |
Publisher |
3515 |
3727 |
+6.03 |
DataReader |
82975 |
85926 |
+3.56 |
DataWriter |
44291 |
45757 |
+3.31 |
Instance |
461 |
480 |
+4.12 |
Sample |
1317 |
1340 |
+1.75 |
Remote DataReader |
6628 |
6529 |
-1.49 |
Remote DataWriter |
14300 |
14698 |
+2.78 |
Instance registered in DataReader |
962 |
980 |
+1.87 |
Sample stored in DataReader |
877 |
894 |
+1.94 |
Remote Participant |
73167 |
73255 |
+0.12 |
3.4.2.1.6. Performance
There are no significant performance differences in throughput between 6.0.0 applications and 5.3.1 applications; however, 6.0.0 has changed the way code generation works for IDL types to support XCDR2 network representation. We have observed that throughput for small data samples and simple types is slightly worse in 6.0.0, especially when using batching.
5.3.1 |
6.0.0 |
Change (%) |
|
---|---|---|---|
32 |
165.7 |
163.3 |
1.5 |
64 |
317.7 |
317.8 |
0.1 |
128 |
609.2 |
593.5 |
2.6 |
256 |
868.9 |
868.7 |
0.1 |
1024 |
952.6 |
952.6 |
0 |
4096 |
974.4 |
974.4 |
0 |
8192 |
981.6 |
981.6 |
0 |
63000 |
991.2 |
991.2 |
0 |
3.4.2.1.7. RTI Connext Micro Compatibility
Connext Micro 2.4.11 and below does not communicate with any Connext 6.0.0 product, due to a change in the RTPS version number introduced in 6.0.0. (See “Fixes Related to OMG Specification Compliance” in the RTI Connext Core Libraries Release Notes.) If you need Connext Micro 2.4.11 applications or below to communicate with Connext 6.0.0 applications, see the article Workaround for discovery failure between RTI Connext Micro 2.4.11 and RTI Connext 6.0.0 or contact RTI Support at support@rti.com.
This issue has been fixed in Connext Micro 2.4.12, which does communicate with a Connext 6.0.x product.