Skip to content

Commit 20fa528

Browse files
richiwaremergify[bot]
authored andcommitted
Fix warning about memory leak (#141)
Signed-off-by: Ricardo González Moreno <[email protected]> (cherry picked from commit 7cbeb21) # Conflicts: # fastdds_python/src/swig/fastdds/dds/core/policy/QosPolicies.i # fastdds_python/src/swig/fastrtps/utils/collections/ResourceLimitedVector.i # fastdds_python/test/api/test_domainparticipant.py
1 parent 9d1675c commit 20fa528

File tree

4 files changed

+148
-33
lines changed

4 files changed

+148
-33
lines changed

fastdds_python/src/swig/fastdds/dds/core/policy/QosPolicies.i

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ namespace dds {
5858
}
5959
}
6060

61+
<<<<<<< HEAD
6162
%inline %{
6263
class OctetResourceLimitedVectorStopIterator {};
6364
class OctetResourceLimitedVectorIterator {
@@ -73,10 +74,13 @@ public:
7374
eprosima::fastrtps::ResourceLimitedVector<eprosima::fastrtps::rtps::octet>::iterator end;
7475
};
7576
%}
77+
=======
78+
>>>>>>> 7cbeb21 (Fix warning about memory leak (#141))
7679

7780
// SWIG does not support templates in the generated binding,
7881
// because not all output languages support them
7982
// We must explicitly declare the specializations of the templates
83+
<<<<<<< HEAD
8084
%template(OctetResourceLimitedVector) eprosima::fastrtps::ResourceLimitedVector<eprosima::fastrtps::rtps::octet>;
8185

8286
%include "fastdds/dds/core/policy/QosPolicies.hpp"
@@ -143,6 +147,12 @@ public:
143147
}
144148
}
145149

150+
=======
151+
resource_limited_vector_template(OctetResourceLimitedVector, eprosima::fastdds::rtps::octet)
152+
153+
%include "fastdds/dds/core/policy/QosPolicies.hpp"
154+
155+
>>>>>>> 7cbeb21 (Fix warning about memory leak (#141))
146156
%exception eprosima::fastdds::dds::PartitionQosPolicy::__getitem__
147157
{
148158
try

fastdds_python/src/swig/fastrtps/utils/collections/ResourceLimitedVector.i

Lines changed: 108 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#include "fastrtps/utils/collections/ResourceLimitedVector.hpp"
1717
%}
1818

19+
%include "exception.i"
20+
1921
// Operator[] is ignored by SWIG because it does not map correctly to target languages
2022
// mostly because of its dual getter/setter nature
2123
// We can ignore them and extend to make the getter and setter methods explicit and break the overload
@@ -26,9 +28,16 @@
2628
// it seems that SWIG handles them differently and compilation fails
2729
// when trying to create a pointer to a reference and/or calling new for a reference
2830
// We rewrite them in terms of pointer results
31+
<<<<<<< HEAD:fastdds_python/src/swig/fastrtps/utils/collections/ResourceLimitedVector.i
2932
%ignore eprosima::fastrtps::ResourceLimitedVector::at;
3033
%ignore eprosima::fastrtps::ResourceLimitedVector::front;
3134
%ignore eprosima::fastrtps::ResourceLimitedVector::back;
35+
=======
36+
%ignore eprosima::fastdds::ResourceLimitedVector::at;
37+
%ignore eprosima::fastdds::ResourceLimitedVector::front;
38+
%ignore eprosima::fastdds::ResourceLimitedVector::back;
39+
%ignore eprosima::fastdds::ResourceLimitedVector::push_back;
40+
>>>>>>> 7cbeb21 (Fix warning about memory leak (#141)):fastdds_python/src/swig/fastdds/utils/collections/ResourceLimitedVector.i
3241

3342
// Initializer lists are note supported in SWIG. Ignore the method
3443
%ignore eprosima::fastrtps::ResourceLimitedVector::assign(std::initializer_list<value_type>);
@@ -37,28 +46,118 @@
3746
// and SWIG does not support it in any case
3847
%ignore eprosima::fastrtps::ResourceLimitedVector::operator const collection_type&;
3948

49+
%exception eprosima::fastdds::ResourceLimitedVector::__getitem__
50+
{
51+
try
52+
{
53+
$action
54+
}
55+
catch(std::out_of_range)
56+
{
57+
SWIG_exception(SWIG_IndexError, "Index out of bounds");
58+
}
59+
}
60+
4061

62+
<<<<<<< HEAD:fastdds_python/src/swig/fastrtps/utils/collections/ResourceLimitedVector.i
4163
%extend eprosima::fastrtps::ResourceLimitedVector {
4264
pointer at(size_type pos)
65+
=======
66+
%extend eprosima::fastdds::ResourceLimitedVector {
67+
68+
size_t __len__() const
69+
>>>>>>> 7cbeb21 (Fix warning about memory leak (#141)):fastdds_python/src/swig/fastdds/utils/collections/ResourceLimitedVector.i
4370
{
44-
return &($self->at(pos));
45-
}
46-
pointer front()
47-
{
48-
return &($self->front());
71+
return self->size();
4972
}
50-
pointer back()
73+
74+
value_type __getitem__(int i)
5175
{
52-
return &($self->back());
76+
if (self->size() <= i)
77+
{
78+
throw std::out_of_range("Index out of bounds");
79+
}
80+
return (*self)[i];
5381
}
5482

5583
pointer getitem(size_type n) {
5684
return &($self->operator[](n));
5785
}
5886

59-
void setitem(size_type n, const_pointer v) {
60-
$self->operator[](n) = *v;
87+
void setitem(size_type n, value_type v) {
88+
$self->operator[](n) = v;
89+
}
90+
91+
void append(value_type v) {
92+
$self->push_back(v);
6193
}
6294
}
6395

96+
<<<<<<< HEAD:fastdds_python/src/swig/fastrtps/utils/collections/ResourceLimitedVector.i
6497
%include "fastrtps/utils/collections/ResourceLimitedVector.hpp"
98+
=======
99+
100+
%include "fastdds/utils/collections/ResourceLimitedVector.hpp"
101+
102+
%define resource_limited_vector_template(name_, value_type_)
103+
%inline %{
104+
class name_ ## StopIterator {};
105+
class name_ ## Iterator
106+
{
107+
public:
108+
name_ ## Iterator(
109+
typename eprosima::fastdds::ResourceLimitedVector<value_type_>::iterator _cur,
110+
typename eprosima::fastdds::ResourceLimitedVector<value_type_>::iterator _end)
111+
: cur(_cur)
112+
, end(_end)
113+
{
114+
}
115+
116+
name_ ## Iterator* __iter__()
117+
{
118+
return this;
119+
}
120+
typename eprosima::fastdds::ResourceLimitedVector<value_type_>::iterator cur;
121+
typename eprosima::fastdds::ResourceLimitedVector<value_type_>::iterator end;
122+
};
123+
%}
124+
125+
%exception name_ ## Iterator::__next__ {
126+
try
127+
{
128+
$action // calls %extend function __next__() below
129+
}
130+
catch (name_ ## StopIterator)
131+
{
132+
PyErr_SetString(PyExc_StopIteration, "End of iterator");
133+
return nullptr;
134+
}
135+
}
136+
137+
%extend name_ ## Iterator
138+
{
139+
value_type_ __next__()
140+
{
141+
if ($self->cur != $self->end)
142+
{
143+
// dereference the iterator and return reference to the object,
144+
// after that it increments the iterator
145+
return *$self->cur++;
146+
}
147+
throw name_ ## StopIterator();
148+
}
149+
}
150+
151+
%template(name_) eprosima::fastdds::ResourceLimitedVector<value_type_>;
152+
153+
%extend eprosima::fastdds::ResourceLimitedVector<value_type_>
154+
{
155+
156+
name_ ## Iterator __iter__()
157+
{
158+
// return a constructed Iterator object
159+
return name_ ## Iterator($self->begin(), $self->end());
160+
}
161+
}
162+
%enddef
163+
>>>>>>> 7cbeb21 (Fix warning about memory leak (#141)):fastdds_python/src/swig/fastdds/utils/collections/ResourceLimitedVector.i

fastdds_python/test/api/test_domainparticipant.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -915,9 +915,15 @@ def test_get_set_qos(participant):
915915
- DomainParticipant::set_qos
916916
"""
917917
qos = fastdds.DomainParticipantQos()
918+
<<<<<<< HEAD
918919
assert(fastdds.ReturnCode_t.RETCODE_OK == participant.get_qos(qos))
919920
qos.user_data().push_back(1)
920921
qos.user_data().push_back(2)
922+
=======
923+
assert(fastdds.RETCODE_OK == participant.get_qos(qos))
924+
qos.user_data().append(1)
925+
qos.user_data().append(2)
926+
>>>>>>> 7cbeb21 (Fix warning about memory leak (#141))
921927
assert(2 == len(qos.user_data()))
922928

923929
assert(fastdds.ReturnCode_t.RETCODE_OK ==

fastdds_python/test/api/test_qos.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -82,10 +82,10 @@ def test_datareader_qos():
8282
assert(2 == datareader_qos.resource_limits().extra_samples)
8383

8484
# .user_data
85-
datareader_qos.user_data().push_back(0)
86-
datareader_qos.user_data().push_back(1)
87-
datareader_qos.user_data().push_back(2)
88-
datareader_qos.user_data().push_back(3)
85+
datareader_qos.user_data().append(0)
86+
datareader_qos.user_data().append(1)
87+
datareader_qos.user_data().append(2)
88+
datareader_qos.user_data().append(3)
8989
count = 1
9090
for user_value in datareader_qos.user_data():
9191
if 1 == count:
@@ -560,10 +560,10 @@ def test_datawriter_qos():
560560
assert(33 == datawriter_qos.lifespan().duration.nanosec)
561561

562562
# .user_data
563-
datawriter_qos.user_data().push_back(0)
564-
datawriter_qos.user_data().push_back(1)
565-
datawriter_qos.user_data().push_back(2)
566-
datawriter_qos.user_data().push_back(3)
563+
datawriter_qos.user_data().append(0)
564+
datawriter_qos.user_data().append(1)
565+
datawriter_qos.user_data().append(2)
566+
datawriter_qos.user_data().append(3)
567567
count = 1
568568
for user_value in datawriter_qos.user_data():
569569
if 1 == count:
@@ -873,10 +873,10 @@ def test_topic_qos():
873873
topic_qos = fastdds.TopicQos()
874874

875875
# .topic_data
876-
topic_qos.topic_data().push_back(0)
877-
topic_qos.topic_data().push_back(1)
878-
topic_qos.topic_data().push_back(2)
879-
topic_qos.topic_data().push_back(3)
876+
topic_qos.topic_data().append(0)
877+
topic_qos.topic_data().append(1)
878+
topic_qos.topic_data().append(2)
879+
topic_qos.topic_data().append(3)
880880
count = 1
881881
for topic_value in topic_qos.topic_data():
882882
if 1 == count:
@@ -1091,10 +1091,10 @@ def test_subscriber_qos():
10911091
assert('Partition2' == subscriber_qos.partition()[1])
10921092

10931093
# .group_data
1094-
subscriber_qos.group_data().push_back(0)
1095-
subscriber_qos.group_data().push_back(1)
1096-
subscriber_qos.group_data().push_back(2)
1097-
subscriber_qos.group_data().push_back(3)
1094+
subscriber_qos.group_data().append(0)
1095+
subscriber_qos.group_data().append(1)
1096+
subscriber_qos.group_data().append(2)
1097+
subscriber_qos.group_data().append(3)
10981098
count = 1
10991099
for group_value in subscriber_qos.group_data():
11001100
if 1 == count:
@@ -1175,10 +1175,10 @@ def test_publisher_qos():
11751175
assert('Partition2' == publisher_qos.partition()[1])
11761176

11771177
# .group_data
1178-
publisher_qos.group_data().push_back(0)
1179-
publisher_qos.group_data().push_back(1)
1180-
publisher_qos.group_data().push_back(2)
1181-
publisher_qos.group_data().push_back(3)
1178+
publisher_qos.group_data().append(0)
1179+
publisher_qos.group_data().append(1)
1180+
publisher_qos.group_data().append(2)
1181+
publisher_qos.group_data().append(3)
11821182
count = 1
11831183
for group_value in publisher_qos.group_data():
11841184
if 1 == count:
@@ -1353,10 +1353,10 @@ def test_domain_participant_qos():
13531353
assert(not participant_qos.transport().use_builtin_transports)
13541354

13551355
# .user_data
1356-
participant_qos.user_data().push_back(0)
1357-
participant_qos.user_data().push_back(1)
1358-
participant_qos.user_data().push_back(2)
1359-
participant_qos.user_data().push_back(3)
1356+
participant_qos.user_data().append(0)
1357+
participant_qos.user_data().append(1)
1358+
participant_qos.user_data().append(2)
1359+
participant_qos.user_data().append(3)
13601360
count = 1
13611361
for user_value in participant_qos.user_data():
13621362
if 1 == count:

0 commit comments

Comments
 (0)