19#ifndef FASTDDS_RTPS_COMMON__CACHECHANGE_HPP
20#define FASTDDS_RTPS_COMMON__CACHECHANGE_HPP
26#include <fastdds/rtps/common/ChangeKind_t.hpp>
27#include <fastdds/rtps/common/FragmentNumber.hpp>
28#include <fastdds/rtps/common/InstanceHandle.hpp>
29#include <fastdds/rtps/common/SerializedPayload.hpp>
30#include <fastdds/rtps/common/Time_t.hpp>
31#include <fastdds/rtps/common/Types.hpp>
32#include <fastdds/rtps/common/VendorId_t.hpp>
33#include <fastdds/rtps/common/WriteParams.hpp>
34#include <fastdds/rtps/history/IPayloadPool.hpp>
131 uint32_t payload_size,
132 bool is_untyped =
false)
155 fragment_size_ = ch_ptr->fragment_size_;
156 fragment_count_ = ch_ptr->fragment_count_;
157 first_missing_fragment_ = ch_ptr->first_missing_fragment_;
196 return fragment_count_;
205 return fragment_size_;
214 return first_missing_fragment_ >= fragment_count_;
222 return 0 < first_missing_fragment_;
233 frag_sns.
base(first_missing_fragment_ + 1);
236 uint32_t current_frag = first_missing_fragment_;
237 while (current_frag < fragment_count_)
239 frag_sns.
add(current_frag + 1);
240 current_frag = get_next_missing_fragment(current_frag);
254 uint16_t fragment_size,
255 bool create_fragment_list =
false)
257 fragment_size_ = fragment_size;
259 first_missing_fragment_ = 0;
261 if (fragment_size > 0)
264 fragment_count_ = (
serializedPayload.length + fragment_size - 1) / fragment_size;
266 if (create_fragment_list)
271 for (uint32_t i = 1; i <= fragment_count_; i++, offset += fragment_size_)
273 set_next_missing_fragment(i - 1, i);
280 first_missing_fragment_ = fragment_count_;
287 uint32_t fragment_starting_num,
288 uint32_t fragments_in_submessage)
290 uint32_t original_offset = (fragment_starting_num - 1) * fragment_size_;
291 uint32_t incoming_length = fragment_size_ * fragments_in_submessage;
292 uint32_t last_fragment_index = fragment_starting_num + fragments_in_submessage - 1;
301 if (last_fragment_index > fragment_count_)
307 if (last_fragment_index == fragment_count_)
313 if (incoming_data.
length < incoming_length)
323 if (received_fragments(fragment_starting_num - 1, fragments_in_submessage))
327 incoming_data.
data, incoming_length);
341 uint32_t payload_size,
342 uint16_t fragment_size,
343 uint32_t& min_required_size)
345 if ((0 == fragment_size) || (payload_size <= fragment_size))
347 min_required_size = payload_size;
352 constexpr uint32_t MAX_PAYLOAD_SIZE = std::numeric_limits<uint32_t>::max() - 4u - 3u;
353 if (payload_size > MAX_PAYLOAD_SIZE)
359 if (fragment_size < 4u)
365 uint32_t fragment_count = payload_size / fragment_size;
366 if (0 != (payload_size % fragment_size))
372 uint32_t last_fragment_offset = (fragment_count - 1) * fragment_size;
377 min_required_size = (last_fragment_offset + 3u) & ~3u;
378 min_required_size += 4u;
381 if (min_required_size < payload_size)
383 min_required_size = payload_size;
392 uint16_t fragment_size_ = 0;
395 uint32_t fragment_count_ = 0;
398 uint32_t first_missing_fragment_ = 0;
400 uint32_t get_next_missing_fragment(
401 uint32_t fragment_index)
403 uint32_t* ptr = next_fragment_pointer(fragment_index);
407 void set_next_missing_fragment(
408 uint32_t fragment_index,
409 uint32_t next_fragment_index)
411 uint32_t* ptr = next_fragment_pointer(fragment_index);
412 *ptr = next_fragment_index;
415 uint32_t* next_fragment_pointer(
416 uint32_t fragment_index)
418 size_t offset = fragment_size_;
419 offset *= fragment_index;
420 offset = (offset + 3u) & ~3u;
421 return reinterpret_cast<uint32_t*
>(&serializedPayload.
data[offset]);
433 bool received_fragments(
434 uint32_t initial_fragment,
435 uint32_t num_of_fragments)
437 bool at_least_one_changed =
false;
439 if ((fragment_size_ > 0) && (initial_fragment < fragment_count_))
441 uint32_t last_fragment = initial_fragment + num_of_fragments;
442 if (last_fragment > fragment_count_)
444 last_fragment = fragment_count_;
447 if (initial_fragment <= first_missing_fragment_)
450 while (first_missing_fragment_ < last_fragment)
452 first_missing_fragment_ = get_next_missing_fragment(first_missing_fragment_);
453 at_least_one_changed =
true;
459 uint32_t current_frag = first_missing_fragment_;
460 while (current_frag < initial_fragment)
462 uint32_t next_frag = get_next_missing_fragment(current_frag);
463 if (next_frag >= initial_fragment)
467 uint32_t next_missing_fragment = next_frag;
468 while (next_missing_fragment < last_fragment)
470 next_missing_fragment = get_next_missing_fragment(next_missing_fragment);
471 at_least_one_changed =
true;
475 if (at_least_one_changed)
477 set_next_missing_fragment(current_frag, next_missing_fragment);
481 current_frag = next_frag;
486 return at_least_one_changed;
T base() const noexcept
Get base of the range.
Definition fixed_size_bitmap.hpp:133
bool add(const T &item) noexcept
Adds an element to the range.
Definition fixed_size_bitmap.hpp:297
Structure Time_t, used to describe times at RTPS protocol.
Definition Time_t.hpp:38
This class contains additional information of a CacheChange.
Definition WriteParams.hpp:37
Contains the RTPS protocol implementation.
uint32_t FragmentNumber_t
Definition FragmentNumber.hpp:34
@ LITTLEEND
Little endianness.
Definition Types.hpp:44
const VendorId_t c_VendorId_Unknown
Definition VendorId_t.hpp:34
std::array< uint8_t, 2 > VendorId_t
Structure VendorId_t, specifying the vendor Id of the implementation.
Definition VendorId_t.hpp:32
constexpr Endianness_t DEFAULT_ENDIAN
Definition Types.hpp:80
ChangeKind_t
Enumerates the different types of CacheChange_t.
Definition ChangeKind_t.hpp:38
@ ALIVE
ALIVE.
Definition ChangeKind_t.hpp:39
BitmapRange< FragmentNumber_t > FragmentNumberSet_t
Structure FragmentNumberSet_t, contains a group of fragmentnumbers.
Definition FragmentNumber.hpp:37
Structure CacheChange_t, contains information on a specific CacheChange.
Definition CacheChange.hpp:81
ChangeKind_t kind
Kind of change, default value ALIVE.
Definition CacheChange.hpp:83
bool is_untyped_
Definition CacheChange.hpp:108
bool contains_first_fragment()
Checks if the first fragment is present.
Definition CacheChange.hpp:220
InstanceHandle_t instanceHandle
Handle of the data associated with this change.
Definition CacheChange.hpp:87
bool isRead
Indicates if the cache has been read (only used in READERS).
Definition CacheChange.hpp:95
static bool calculate_required_fragmented_payload_size(uint32_t payload_size, uint16_t fragment_size, uint32_t &min_required_size)
Calculate the minimum required payload size to store a fragmented change.
Definition CacheChange.hpp:340
fastdds::rtps::VendorId_t vendor_id
Vendor Id of the writer that generated this change.
Definition CacheChange.hpp:99
Time_t sourceTimestamp
Source TimeStamp.
Definition CacheChange.hpp:97
CacheChange_t(const CacheChange_t &)=delete
void setFragmentSize(uint16_t fragment_size, bool create_fragment_list=false)
Set fragment size for this change.
Definition CacheChange.hpp:253
CacheChangeReaderInfo_t reader_info
Definition CacheChange.hpp:103
virtual ~CacheChange_t()=default
SerializedPayload_t inline_qos
CDR serialization of inlined QoS for this change.
Definition CacheChange.hpp:93
void copy_not_memcpy(const CacheChange_t *ch_ptr)
Copy information form a different change into this one.
Definition CacheChange.hpp:167
uint16_t getFragmentSize() const
Get the size of each fragment this change is split into.
Definition CacheChange.hpp:203
uint32_t getFragmentCount() const
Get the number of fragments this change is split into.
Definition CacheChange.hpp:194
bool copy(const CacheChange_t *ch_ptr)
Copy a different change into this one.
Definition CacheChange.hpp:143
bool add_fragments(const SerializedPayload_t &incoming_data, uint32_t fragment_starting_num, uint32_t fragments_in_submessage)
Definition CacheChange.hpp:285
CacheChangeWriterInfo_t writer_info
Definition CacheChange.hpp:104
GUID_t writerGUID
GUID_t of the writer that generated this change.
Definition CacheChange.hpp:85
CacheChange_t(uint32_t payload_size, bool is_untyped=false)
Constructor with payload size.
Definition CacheChange.hpp:130
SerializedPayload_t serializedPayload
Serialized Payload associated with the change.
Definition CacheChange.hpp:91
void get_missing_fragments(FragmentNumberSet_t &frag_sns)
Fills a FragmentNumberSet_t with the list of missing fragments.
Definition CacheChange.hpp:229
SequenceNumber_t sequenceNumber
SequenceNumber of the change.
Definition CacheChange.hpp:89
CacheChange_t()
Default constructor.
Definition CacheChange.hpp:114
WriteParams write_params
Definition CacheChange.hpp:107
bool is_fully_assembled()
Checks if all fragments have been received.
Definition CacheChange.hpp:212
Specific information for a reader.
Definition CacheChange.hpp:65
Time_t receptionTimestamp
Reception TimeStamp (only used in Readers).
Definition CacheChange.hpp:67
int32_t no_writers_generation_count
No-writers generation of the instance when this entry was added to it.
Definition CacheChange.hpp:71
uint32_t writer_ownership_strength
Ownership stregth of its writer when the sample was received.
Definition CacheChange.hpp:73
int32_t disposed_generation_count
Disposed generation of the instance when this entry was added to it.
Definition CacheChange.hpp:69
Specific information for a writer.
Definition CacheChange.hpp:46
std::atomic_bool is_linked
Used to know if the object is already in a list.
Definition CacheChange.hpp:56
FragmentNumber_t last_fragment_sent
Last fragment number sent.
Definition CacheChange.hpp:58
size_t num_sent_submessages
Number of DATA / DATA_FRAG submessages sent to the transport (only used in Writers).
Definition CacheChange.hpp:48
CacheChange_t *volatile next
Used to link with next node in a list.
Definition CacheChange.hpp:54
CacheChange_t *volatile previous
Used to link with previous node in a list.
Definition CacheChange.hpp:51
Structure GUID_t, entity identifier, unique in DDS-RTPS Domain.
Definition Guid.hpp:40
Struct InstanceHandle_t, used to contain the key for WITH_KEY topics.
Definition InstanceHandle.hpp:154
Structure SequenceNumber_t, different for each change in the same writer.
Definition SequenceNumber.hpp:38
Structure SerializedPayload_t.
Definition SerializedPayload.hpp:59
octet * data
Pointer to the data.
Definition SerializedPayload.hpp:68
uint16_t encapsulation
Encapsulation of the data as suggested in the RTPS 2.1 specification chapter 10.
Definition SerializedPayload.hpp:64
bool is_serialized_key
Whether the payload contains a serialized key, or the whole data.
Definition SerializedPayload.hpp:76
uint32_t length
Actual length of the data.
Definition SerializedPayload.hpp:66