26
26
#include < cstdlib>
27
27
#include < cstring>
28
28
29
- namespace eprosima {
30
- namespace fastrtps {
31
- namespace rtps {
32
-
29
+ namespace eprosima {
30
+ namespace fastrtps {
31
+ namespace rtps {
33
32
34
33
// !Max size of RTPS message in bytes.
35
34
#define RTPSMESSAGE_DEFAULT_SIZE 10500 // max size of rtps message in bytes
@@ -48,43 +47,44 @@ namespace rtps{
48
47
* @brief Structure CDRMessage_t, contains a serialized message.
49
48
* @ingroup COMMON_MODULE
50
49
*/
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
+ {
64
56
}
65
57
66
58
~CDRMessage_t ()
67
59
{
68
- if (buffer != nullptr && !wraps)
60
+ if (buffer != nullptr && !wraps)
61
+ {
69
62
free (buffer);
63
+ }
70
64
}
71
65
72
66
/* *
73
67
* Constructor with maximum size
74
68
* @param size Maximum size
75
69
*/
76
- CDRMessage_t (uint32_t size)
70
+ explicit CDRMessage_t (
71
+ uint32_t size)
77
72
{
78
73
wraps = false ;
79
74
pos = 0 ;
80
75
length = 0 ;
81
76
82
- if (size != 0 )
77
+ if (size != 0 )
78
+ {
83
79
buffer = (octet*)malloc (size);
80
+ }
84
81
else
82
+ {
85
83
buffer = nullptr ;
84
+ }
86
85
87
86
max_size = size;
87
+ reserved_size = size;
88
88
89
89
#if __BIG_ENDIAN__
90
90
msg_endian = BIGEND;
@@ -94,36 +94,44 @@ struct RTPS_DllAPI CDRMessage_t{
94
94
}
95
95
96
96
/* *
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 )
101
103
{
102
104
msg_endian = payload.encapsulation == PL_CDR_BE ? BIGEND : LITTLEEND;
103
105
pos = payload.pos ;
104
106
length = payload.length ;
105
107
buffer = payload.data ;
106
108
max_size = payload.max_size ;
109
+ reserved_size = payload.max_size ;
107
110
}
108
111
109
- CDRMessage_t (const CDRMessage_t& message)
112
+ CDRMessage_t (
113
+ const CDRMessage_t& message)
110
114
{
111
115
wraps = false ;
112
116
pos = 0 ;
113
117
length = message.length ;
114
118
max_size = message.max_size ;
115
119
msg_endian = message.msg_endian ;
116
120
117
- if (max_size != 0 )
121
+ reserved_size = max_size;
122
+ if (max_size != 0 )
118
123
{
119
124
buffer = (octet*)malloc (max_size);
120
125
memcpy (buffer, message.buffer , length);
121
126
}
122
127
else
128
+ {
123
129
buffer = nullptr ;
130
+ }
124
131
}
125
132
126
- CDRMessage_t (CDRMessage_t&& message)
133
+ CDRMessage_t (
134
+ CDRMessage_t&& message)
127
135
{
128
136
wraps = message.wraps ;
129
137
message.wraps = false ;
@@ -133,6 +141,8 @@ struct RTPS_DllAPI CDRMessage_t{
133
141
message.length = 0 ;
134
142
max_size = message.max_size ;
135
143
message.max_size = 0 ;
144
+ reserved_size = message.reserved_size ;
145
+ message.reserved_size = 0 ;
136
146
msg_endian = message.msg_endian ;
137
147
#if __BIG_ENDIAN__
138
148
message.msg_endian = BIGEND;
@@ -143,7 +153,8 @@ struct RTPS_DllAPI CDRMessage_t{
143
153
message.buffer = nullptr ;
144
154
}
145
155
146
- CDRMessage_t& operator =(CDRMessage_t &&message)
156
+ CDRMessage_t& operator =(
157
+ CDRMessage_t&& message)
147
158
{
148
159
wraps = message.wraps ;
149
160
message.wraps = false ;
@@ -153,6 +164,8 @@ struct RTPS_DllAPI CDRMessage_t{
153
164
message.length = 0 ;
154
165
max_size = message.max_size ;
155
166
message.max_size = 0 ;
167
+ reserved_size = message.reserved_size ;
168
+ message.reserved_size = 0 ;
156
169
msg_endian = message.msg_endian ;
157
170
#if __BIG_ENDIAN__
158
171
message.msg_endian = BIGEND;
@@ -169,7 +182,7 @@ struct RTPS_DllAPI CDRMessage_t{
169
182
uint32_t size)
170
183
{
171
184
assert (wraps == false );
172
- if (size > max_size )
185
+ if (size > reserved_size )
173
186
{
174
187
octet* new_buffer = (octet*) realloc (buffer, size);
175
188
if (new_buffer == nullptr )
@@ -179,9 +192,11 @@ struct RTPS_DllAPI CDRMessage_t{
179
192
else
180
193
{
181
194
buffer = new_buffer;
182
- max_size = size;
195
+ reserved_size = size;
183
196
}
184
197
}
198
+
199
+ max_size = size;
185
200
}
186
201
187
202
// !Pointer to the buffer where the data is stored.
@@ -190,6 +205,8 @@ struct RTPS_DllAPI CDRMessage_t{
190
205
uint32_t pos;
191
206
// !Max size of the message.
192
207
uint32_t max_size;
208
+ // !Size allocated on buffer. May be higher than max_size.
209
+ uint32_t reserved_size;
193
210
// !Current length of the message.
194
211
uint32_t length;
195
212
// !Endianness of the message.
@@ -198,8 +215,9 @@ struct RTPS_DllAPI CDRMessage_t{
198
215
bool wraps;
199
216
};
200
217
201
- }
202
- }
203
- }
204
- #endif
218
+ } // namespace rtps
219
+ } // namespace fastrtps
220
+ } // namespace eprosima
221
+
222
+ #endif /* DOXYGEN_SHOULD_SKIP_THIS_PUBLIC */
205
223
#endif /* _FASTDDS_RTPS_CDRMESSAGE_T_H_ */
0 commit comments