Skip to content

Commit 8caf888

Browse files
mergify[bot]richiware
authored andcommitted
Fix warning about memory leak (#141) (#159)
(cherry picked from commit 7cbeb21) Signed-off-by: Ricardo González Moreno <ricardo@richiware.dev> Signed-off-by: eduponz <eduardoponz@eprosima.com> Co-authored-by: Ricardo González <ricardo@richiware.dev>
1 parent 1c3018d commit 8caf888

4 files changed

Lines changed: 119 additions & 115 deletions

File tree

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

Lines changed: 1 addition & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -58,91 +58,13 @@ namespace dds {
5858
}
5959
}
6060

61-
%inline %{
62-
class OctetResourceLimitedVectorStopIterator {};
63-
class OctetResourceLimitedVectorIterator {
64-
public:
65-
OctetResourceLimitedVectorIterator(
66-
eprosima::fastrtps::ResourceLimitedVector<eprosima::fastrtps::rtps::octet>::iterator _cur,
67-
eprosima::fastrtps::ResourceLimitedVector<eprosima::fastrtps::rtps::octet>::iterator _end) : cur(_cur), end(_end) {}
68-
OctetResourceLimitedVectorIterator* __iter__()
69-
{
70-
return this;
71-
}
72-
eprosima::fastrtps::ResourceLimitedVector<eprosima::fastrtps::rtps::octet>::iterator cur;
73-
eprosima::fastrtps::ResourceLimitedVector<eprosima::fastrtps::rtps::octet>::iterator end;
74-
};
75-
%}
76-
7761
// SWIG does not support templates in the generated binding,
7862
// because not all output languages support them
7963
// We must explicitly declare the specializations of the templates
80-
%template(OctetResourceLimitedVector) eprosima::fastrtps::ResourceLimitedVector<eprosima::fastrtps::rtps::octet>;
64+
resource_limited_vector_template(OctetResourceLimitedVector, eprosima::fastrtps::rtps::octet)
8165

8266
%include "fastdds/dds/core/policy/QosPolicies.hpp"
8367

84-
%include "exception.i"
85-
%exception OctetResourceLimitedVectorIterator::__next__ {
86-
try
87-
{
88-
$action // calls %extend function __next__() below
89-
}
90-
catch (OctetResourceLimitedVectorStopIterator)
91-
{
92-
PyErr_SetString(PyExc_StopIteration, "End of iterator");
93-
return nullptr;
94-
}
95-
}
96-
97-
%extend OctetResourceLimitedVectorIterator
98-
{
99-
eprosima::fastrtps::rtps::octet __next__()
100-
{
101-
if ($self->cur != $self->end)
102-
{
103-
// dereference the iterator and return reference to the object,
104-
// after that it increments the iterator
105-
return *$self->cur++;
106-
}
107-
throw OctetResourceLimitedVectorStopIterator();
108-
}
109-
}
110-
111-
%exception eprosima::fastrtps::ResourceLimitedVector<eprosima::fastrtps::rtps::octet>::__getitem__
112-
{
113-
try
114-
{
115-
$action
116-
}
117-
catch(std::out_of_range)
118-
{
119-
SWIG_exception(SWIG_IndexError, "Index out of bounds");
120-
}
121-
}
122-
123-
%extend eprosima::fastrtps::ResourceLimitedVector<eprosima::fastrtps::rtps::octet>
124-
{
125-
OctetResourceLimitedVectorIterator __iter__()
126-
{
127-
// return a constructed Iterator object
128-
return OctetResourceLimitedVectorIterator($self->begin(), $self->end());
129-
}
130-
131-
size_t __len__() const
132-
{
133-
return self->size();
134-
}
135-
136-
eprosima::fastrtps::rtps::octet __getitem__(int i)
137-
{
138-
if (self->size() <= i)
139-
{
140-
throw std::out_of_range("Index out of bounds");
141-
}
142-
return (*self)[i];
143-
}
144-
}
145-
14668
%exception eprosima::fastdds::dds::PartitionQosPolicy::__getitem__
14769
{
14870
try

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

Lines changed: 92 additions & 10 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
@@ -29,6 +31,7 @@
2931
%ignore eprosima::fastrtps::ResourceLimitedVector::at;
3032
%ignore eprosima::fastrtps::ResourceLimitedVector::front;
3133
%ignore eprosima::fastrtps::ResourceLimitedVector::back;
34+
%ignore eprosima::fastrtps::ResourceLimitedVector::push_back;
3235

3336
// Initializer lists are note supported in SWIG. Ignore the method
3437
%ignore eprosima::fastrtps::ResourceLimitedVector::assign(std::initializer_list<value_type>);
@@ -37,28 +40,107 @@
3740
// and SWIG does not support it in any case
3841
%ignore eprosima::fastrtps::ResourceLimitedVector::operator const collection_type&;
3942

40-
41-
%extend eprosima::fastrtps::ResourceLimitedVector {
42-
pointer at(size_type pos)
43+
%exception eprosima::fastdds::ResourceLimitedVector::__getitem__
44+
{
45+
try
46+
{
47+
$action
48+
}
49+
catch(std::out_of_range)
4350
{
44-
return &($self->at(pos));
51+
SWIG_exception(SWIG_IndexError, "Index out of bounds");
4552
}
46-
pointer front()
53+
}
54+
55+
56+
%extend eprosima::fastrtps::ResourceLimitedVector {
57+
58+
size_t __len__() const
4759
{
48-
return &($self->front());
60+
return self->size();
4961
}
50-
pointer back()
62+
63+
value_type __getitem__(int i)
5164
{
52-
return &($self->back());
65+
if (self->size() <= i)
66+
{
67+
throw std::out_of_range("Index out of bounds");
68+
}
69+
return (*self)[i];
5370
}
5471

5572
pointer getitem(size_type n) {
5673
return &($self->operator[](n));
5774
}
5875

59-
void setitem(size_type n, const_pointer v) {
60-
$self->operator[](n) = *v;
76+
void setitem(size_type n, value_type v) {
77+
$self->operator[](n) = v;
78+
}
79+
80+
void append(value_type v) {
81+
$self->push_back(v);
6182
}
6283
}
6384

6485
%include "fastrtps/utils/collections/ResourceLimitedVector.hpp"
86+
87+
%define resource_limited_vector_template(name_, value_type_)
88+
%inline %{
89+
class name_ ## StopIterator {};
90+
class name_ ## Iterator
91+
{
92+
public:
93+
name_ ## Iterator(
94+
typename eprosima::fastrtps::ResourceLimitedVector<value_type_>::iterator _cur,
95+
typename eprosima::fastrtps::ResourceLimitedVector<value_type_>::iterator _end)
96+
: cur(_cur)
97+
, end(_end)
98+
{
99+
}
100+
101+
name_ ## Iterator* __iter__()
102+
{
103+
return this;
104+
}
105+
typename eprosima::fastrtps::ResourceLimitedVector<value_type_>::iterator cur;
106+
typename eprosima::fastrtps::ResourceLimitedVector<value_type_>::iterator end;
107+
};
108+
%}
109+
110+
%exception name_ ## Iterator::__next__ {
111+
try
112+
{
113+
$action // calls %extend function __next__() below
114+
}
115+
catch (name_ ## StopIterator)
116+
{
117+
PyErr_SetString(PyExc_StopIteration, "End of iterator");
118+
return nullptr;
119+
}
120+
}
121+
122+
%extend name_ ## Iterator
123+
{
124+
value_type_ __next__()
125+
{
126+
if ($self->cur != $self->end)
127+
{
128+
// dereference the iterator and return reference to the object,
129+
// after that it increments the iterator
130+
return *$self->cur++;
131+
}
132+
throw name_ ## StopIterator();
133+
}
134+
}
135+
136+
%template(name_) eprosima::fastrtps::ResourceLimitedVector<value_type_>;
137+
138+
%extend eprosima::fastrtps::ResourceLimitedVector<value_type_>
139+
{
140+
name_ ## Iterator __iter__()
141+
{
142+
// return a constructed Iterator object
143+
return name_ ## Iterator($self->begin(), $self->end());
144+
}
145+
}
146+
%enddef

fastdds_python/test/api/test_domainparticipant.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -907,8 +907,8 @@ def test_get_set_qos(participant):
907907
"""
908908
qos = fastdds.DomainParticipantQos()
909909
assert(fastdds.ReturnCode_t.RETCODE_OK == participant.get_qos(qos))
910-
qos.user_data().push_back(1)
911-
qos.user_data().push_back(2)
910+
qos.user_data().append(1)
911+
qos.user_data().append(2)
912912
assert(2 == len(qos.user_data()))
913913

914914
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)