Skip to content

Commit b800b44

Browse files
Fixed error sending more than 256 fragments (#974)
* Refs #7404. Added blackbox tests. * Refs #7404. Style on CDRMessage_t.h * Refs #7404. Deprecated CDRMessage_t default constructor. * Refs #7404. Distinguish reserved_size and max_size on CDRMessage_t. * Refs #7404. Force high_mark_for_frag_ to be multiple of 4. * Refs #7404. Fix for synchronous StatelessWriter. * Refs #7404. Fix for synchronous StatefulWriter. * Refs #7404. Fix for asynchronous StatelessWriter. * Refs #7404. Style on PublisherImpl.cpp * Refs #7404. Style on DataWriterImpl.cpp Co-authored-by: Miguel Company <[email protected]>
1 parent df97c21 commit b800b44

File tree

16 files changed

+387
-388
lines changed

16 files changed

+387
-388
lines changed

include/fastdds/rtps/common/CDRMessage_t.h

Lines changed: 52 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,9 @@
2626
#include <cstdlib>
2727
#include <cstring>
2828

29-
namespace eprosima{
30-
namespace fastrtps{
31-
namespace rtps{
32-
29+
namespace eprosima {
30+
namespace fastrtps {
31+
namespace rtps {
3332

3433
//!Max size of RTPS message in bytes.
3534
#define RTPSMESSAGE_DEFAULT_SIZE 10500 //max size of rtps message in bytes
@@ -48,43 +47,44 @@ namespace rtps{
4847
* @brief Structure CDRMessage_t, contains a serialized message.
4948
* @ingroup COMMON_MODULE
5049
*/
51-
struct RTPS_DllAPI CDRMessage_t{
52-
//! Default constructor
53-
CDRMessage_t():wraps(false){
54-
pos = 0;
55-
length = 0;
56-
buffer = (octet*) malloc(RTPSMESSAGE_DEFAULT_SIZE);
57-
max_size = RTPSMESSAGE_DEFAULT_SIZE;
58-
59-
#if __BIG_ENDIAN__
60-
msg_endian = BIGEND;
61-
#else
62-
msg_endian = LITTLEEND;
63-
#endif
50+
struct RTPS_DllAPI CDRMessage_t final
51+
{
52+
// TODO(Miguel C): Deprecate when not used in mocks
53+
CDRMessage_t()
54+
: CDRMessage_t(RTPSMESSAGE_DEFAULT_SIZE)
55+
{
6456
}
6557

6658
~CDRMessage_t()
6759
{
68-
if(buffer != nullptr && !wraps)
60+
if (buffer != nullptr && !wraps)
61+
{
6962
free(buffer);
63+
}
7064
}
7165

7266
/**
7367
* Constructor with maximum size
7468
* @param size Maximum size
7569
*/
76-
CDRMessage_t(uint32_t size)
70+
explicit CDRMessage_t(
71+
uint32_t size)
7772
{
7873
wraps = false;
7974
pos = 0;
8075
length = 0;
8176

82-
if(size != 0)
77+
if (size != 0)
78+
{
8379
buffer = (octet*)malloc(size);
80+
}
8481
else
82+
{
8583
buffer = nullptr;
84+
}
8685

8786
max_size = size;
87+
reserved_size = size;
8888

8989
#if __BIG_ENDIAN__
9090
msg_endian = BIGEND;
@@ -94,36 +94,44 @@ struct RTPS_DllAPI CDRMessage_t{
9494
}
9595

9696
/**
97-
* Constructor to wrap a serialized payload
98-
* @param payload Payload to wrap
99-
*/
100-
CDRMessage_t(const SerializedPayload_t& payload) : wraps(true)
97+
* Constructor to wrap a serialized payload
98+
* @param payload Payload to wrap
99+
*/
100+
explicit CDRMessage_t(
101+
const SerializedPayload_t& payload)
102+
: wraps(true)
101103
{
102104
msg_endian = payload.encapsulation == PL_CDR_BE ? BIGEND : LITTLEEND;
103105
pos = payload.pos;
104106
length = payload.length;
105107
buffer = payload.data;
106108
max_size = payload.max_size;
109+
reserved_size = payload.max_size;
107110
}
108111

109-
CDRMessage_t(const CDRMessage_t& message)
112+
CDRMessage_t(
113+
const CDRMessage_t& message)
110114
{
111115
wraps = false;
112116
pos = 0;
113117
length = message.length;
114118
max_size = message.max_size;
115119
msg_endian = message.msg_endian;
116120

117-
if(max_size != 0)
121+
reserved_size = max_size;
122+
if (max_size != 0)
118123
{
119124
buffer = (octet*)malloc(max_size);
120125
memcpy(buffer, message.buffer, length);
121126
}
122127
else
128+
{
123129
buffer = nullptr;
130+
}
124131
}
125132

126-
CDRMessage_t(CDRMessage_t&& message)
133+
CDRMessage_t(
134+
CDRMessage_t&& message)
127135
{
128136
wraps = message.wraps;
129137
message.wraps = false;
@@ -133,6 +141,8 @@ struct RTPS_DllAPI CDRMessage_t{
133141
message.length = 0;
134142
max_size = message.max_size;
135143
message.max_size = 0;
144+
reserved_size = message.reserved_size;
145+
message.reserved_size = 0;
136146
msg_endian = message.msg_endian;
137147
#if __BIG_ENDIAN__
138148
message.msg_endian = BIGEND;
@@ -143,7 +153,8 @@ struct RTPS_DllAPI CDRMessage_t{
143153
message.buffer = nullptr;
144154
}
145155

146-
CDRMessage_t& operator=(CDRMessage_t &&message)
156+
CDRMessage_t& operator =(
157+
CDRMessage_t&& message)
147158
{
148159
wraps = message.wraps;
149160
message.wraps = false;
@@ -153,6 +164,8 @@ struct RTPS_DllAPI CDRMessage_t{
153164
message.length = 0;
154165
max_size = message.max_size;
155166
message.max_size = 0;
167+
reserved_size = message.reserved_size;
168+
message.reserved_size = 0;
156169
msg_endian = message.msg_endian;
157170
#if __BIG_ENDIAN__
158171
message.msg_endian = BIGEND;
@@ -169,7 +182,7 @@ struct RTPS_DllAPI CDRMessage_t{
169182
uint32_t size)
170183
{
171184
assert(wraps == false);
172-
if (size > max_size)
185+
if (size > reserved_size)
173186
{
174187
octet* new_buffer = (octet*) realloc(buffer, size);
175188
if (new_buffer == nullptr)
@@ -179,9 +192,11 @@ struct RTPS_DllAPI CDRMessage_t{
179192
else
180193
{
181194
buffer = new_buffer;
182-
max_size = size;
195+
reserved_size = size;
183196
}
184197
}
198+
199+
max_size = size;
185200
}
186201

187202
//!Pointer to the buffer where the data is stored.
@@ -190,6 +205,8 @@ struct RTPS_DllAPI CDRMessage_t{
190205
uint32_t pos;
191206
//!Max size of the message.
192207
uint32_t max_size;
208+
//!Size allocated on buffer. May be higher than max_size.
209+
uint32_t reserved_size;
193210
//!Current length of the message.
194211
uint32_t length;
195212
//!Endianness of the message.
@@ -198,8 +215,9 @@ struct RTPS_DllAPI CDRMessage_t{
198215
bool wraps;
199216
};
200217

201-
}
202-
}
203-
}
204-
#endif
218+
} // namespace rtps
219+
} // namespace fastrtps
220+
} // namespace eprosima
221+
222+
#endif /* DOXYGEN_SHOULD_SKIP_THIS_PUBLIC */
205223
#endif /* _FASTDDS_RTPS_CDRMESSAGE_T_H_ */

include/fastdds/rtps/messages/RTPSMessageCreator.h

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,8 @@ class RTPSMessageCreator
5151
{
5252
public:
5353

54-
RTPSMessageCreator();
55-
virtual ~RTPSMessageCreator();
56-
57-
//!
58-
CDRMessage_t rtpsmc_submsgElem;
59-
//!
60-
CDRMessage_t rtpsmc_submsgHeader;
61-
62-
54+
RTPSMessageCreator() = delete;
55+
~RTPSMessageCreator() = delete;
6356

6457
/**
6558
* Create a Header to the serialized message.

include/fastdds/rtps/network/ReceiverResource.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ class ReceiverResource : public fastdds::rtps::TransportReceiverInterface
9393

9494
std::mutex mtx;
9595
MessageReceiver* receiver;
96-
CDRMessage_t msg;
9796
};
9897

9998
} // namespace rtps

0 commit comments

Comments
 (0)