.. include:: /../getting_started/vars.rst .. _section-Product-Core: RTI Connext DDS 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. APIs ==== The following Application Program Interfaces (APIs) have been changed or deprecated in 6.0.0. For new APIs, see :link_connext_whats_new_600:`What's New in 6.0.0 <>`. Wchar and wstring language binding changes ------------------------------------------ See information about this change in :numref:`section-General-wchar_wstring`. Dynamic Data compatibility issues --------------------------------- 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. Unsupported members ^^^^^^^^^^^^^^^^^^^ Starting in 6.0.0, the following members in the ``DynamicDataTypeSerializationProperty_t`` are no longer supported: - ``use_42e_compatible_alignment`` (see :numref:`section-General-42e_alignment`) - ``max_size_serialized`` - ``min_size_serialized`` The size of the ``DynamicData`` buffers in the |DR|’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`` |DR|. The default behavior for a ``DynamicData`` |DR| is that samples are allocated to the minimum deserialized size and can grow to any size required to store incoming samples. Generated Code ============== .. _section-Product-STL: 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``, 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 to ``std::vector``. - Strings map to ``std::string``. - Wide strings map to ``std::wstring``, wide characters map to ``wchar_t``. - Members with the new annotation ``@external`` (equivalent to the * pointer notation) map to the type ``dds::core::external``, a type similar to ``shared_ptr`` (see the API Reference HTML documentation for more details). For example, consider the following IDL type: .. code-block:: text struct MyType { sequence my_unbounded_seq; sequence my_bounded_seq; @use_vector sequence 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: .. code-block:: bash rtiddsgen -language C++11 -unboundedSupport MyType.idl .. code-block:: C++ class MyType { public: MyType(); MyType(const std::vector& my_unbounded_seq, const rti::core::bounded_sequence& my_bounded_seq, const std::vector& my_other_bounded_seq, const std::string& my_str, dds::core::external my_external); MyType (MyType&&) = default; MyType& operator=(MyType&&) = default; MyType& operator=(const MyType&) = default; MyType(const MyType&) = default; std::vector& my_unbounded_seq() noexcept; const std::vector& my_unbounded_seq() const noexcept; void my_unbounded_seq(const std::vector& value); rti::core::bounded_sequence& my_bounded_seq() noexcept; const rti::core::bounded_sequence& my_bounded_seq() const noexcept; void my_bounded_seq(const rti::core::bounded_sequence& value); std::vector& my_other_bounded_seq() noexcept; const std::vector& my_other_bounded_seq() const noexcept; void my_other_bounded_seq(const std::vector& value); std::string& my_str() noexcept; const std::string& my_str() const noexcept; void my_str(const std::string& value); dds::core::external& my_external() noexcept; const dds::core::external& my_external() const noexcept; void my_external(dds::core::external 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: .. code-block:: bash rtiddsgen -language C++11 -legacyPlugin -unboundedSupport MyType.idl .. code-block:: C++ class MyType { public: MyType(); MyType( const dds::core::vector& my_unbounded_seq_param, const dds::core::vector& my_bounded_seq_param, const dds::core::vector& 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& my_unbounded_seq() noexcept; const dds::core::vector& my_unbounded_seq() const noexcept; void my_unbounded_seq(const dds::core::vector& value); dds::core::vector& my_bounded_seq() noexcept; const dds::core::vector& my_bounded_seq() const noexcept; void my_bounded_seq(const dds::core::vector& value); dds::core::vector& my_other_bounded_seq() noexcept; const dds::core::vector& my_other_bounded_seq() const noexcept; void my_other_bounded_seq(const dds::core::vector& 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; }; .. _section-General-Qos: QoS === .. |tc.ignore_mem| replace:: dds.type_consistency.ignore_member_names .. |tc.ignore_seq| replace:: dds.type_consistency.ignore_sequence_bounds .. _section-Product-Core-Ignore_Properties: Properties |tc.ignore_mem| and |tc.ignore_seq| 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 :link_connext_gsg_ext_types:`RTI Connext DDS Core Libraries Getting Started Guide Addendum for Extensible Types <>`. 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: .. list-table:: Library Size Comparison for x64Linux3gcc4.8.2 in MBs :name: TableCoreLibrarySize :widths: 70 10 10 10 :header-rows: 1 :class: longtable * - - 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 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: .. list-table:: Memory Comsumption Comparison for x64Linux3gcc4.8.2 in Bytes :name: TableCoreMemoryComsumption :widths: 70 10 10 10 :header-rows: 1 :class: longtable * - - 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 * - |DR| - 82975 - 85926 - +3.56 * - |DW| - 44291 - 45757 - +3.31 * - Instance - 461 - 480 - +4.12 * - Sample - 1317 - 1340 - +1.75 * - Remote |DR| - 6628 - 6529 - -1.49 * - Remote |DW| - 14300 - 14698 - +2.78 * - Instance registered in |DR| - 962 - 980 - +1.87 * - Sample stored in |DR| - 877 - 894 - +1.94 * - Remote Participant - 73167 - 73255 - +0.12 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. .. list-table:: C++/Keyed/Throughput (Mbps) :name: TableCoreThroughput :widths: 70 10 10 10 :header-rows: 1 :class: longtable * - - 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 .. _section-Core-Micro: RTI Connext DDS 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 :link_connext_omg_release_notes:`"Fixes Related to OMG Specification Compliance" in the RTI Connext DDS 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 DDS Micro 2.4.11 and RTI Connext DDS 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.