Skip to content

Commit 243c4be

Browse files
committed
Refs #21176. Fix warning about memory leak
Signed-off-by: Ricardo González Moreno <ricardo@richiware.dev>
1 parent ffae49c commit 243c4be

4 files changed

Lines changed: 121 additions & 114 deletions

File tree

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

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

61-
%inline %{
62-
class OctetResourceLimitedVectorStopIterator {};
63-
class OctetResourceLimitedVectorIterator {
64-
public:
65-
OctetResourceLimitedVectorIterator(
66-
eprosima::fastdds::ResourceLimitedVector<eprosima::fastdds::rtps::octet>::iterator _cur,
67-
eprosima::fastdds::ResourceLimitedVector<eprosima::fastdds::rtps::octet>::iterator _end) : cur(_cur), end(_end) {}
68-
OctetResourceLimitedVectorIterator* __iter__()
69-
{
70-
return this;
71-
}
72-
eprosima::fastdds::ResourceLimitedVector<eprosima::fastdds::rtps::octet>::iterator cur;
73-
eprosima::fastdds::ResourceLimitedVector<eprosima::fastdds::rtps::octet>::iterator end;
74-
};
75-
%}
7661

7762
// SWIG does not support templates in the generated binding,
7863
// because not all output languages support them
7964
// We must explicitly declare the specializations of the templates
80-
%template(OctetResourceLimitedVector) eprosima::fastdds::ResourceLimitedVector<eprosima::fastdds::rtps::octet>;
65+
resource_limited_vector_template(OctetResourceLimitedVector, eprosima::fastdds::rtps::octet)
8166

8267
%include "fastdds/dds/core/policy/QosPolicies.hpp"
8368

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::fastdds::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::fastdds::ResourceLimitedVector<eprosima::fastdds::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::fastdds::ResourceLimitedVector<eprosima::fastdds::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::fastdds::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-
14669
%exception eprosima::fastdds::dds::PartitionQosPolicy::__getitem__
14770
{
14871
try

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

Lines changed: 94 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#include "fastdds/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::fastdds::ResourceLimitedVector::at;
3032
%ignore eprosima::fastdds::ResourceLimitedVector::front;
3133
%ignore eprosima::fastdds::ResourceLimitedVector::back;
34+
%ignore eprosima::fastdds::ResourceLimitedVector::push_back;
3235

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

40-
41-
%extend eprosima::fastdds::ResourceLimitedVector {
42-
pointer at(size_type pos)
43+
%exception eprosima::fastdds::ResourceLimitedVector::__getitem__
44+
{
45+
try
4346
{
44-
return &($self->at(pos));
47+
$action
4548
}
46-
pointer front()
49+
catch(std::out_of_range)
4750
{
48-
return &($self->front());
51+
SWIG_exception(SWIG_IndexError, "Index out of bounds");
4952
}
50-
pointer back()
53+
}
54+
55+
56+
%extend eprosima::fastdds::ResourceLimitedVector {
57+
58+
size_t __len__() const
5159
{
52-
return &($self->back());
60+
return self->size();
61+
}
62+
63+
value_type __getitem__(int i)
64+
{
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

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

fastdds_python/test/api/test_domainparticipant.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -916,8 +916,8 @@ def test_get_set_qos(participant):
916916
"""
917917
qos = fastdds.DomainParticipantQos()
918918
assert(fastdds.RETCODE_OK == participant.get_qos(qos))
919-
qos.user_data().push_back(1)
920-
qos.user_data().push_back(2)
919+
qos.user_data().append(1)
920+
qos.user_data().append(2)
921921
assert(2 == len(qos.user_data()))
922922

923923
assert(fastdds.RETCODE_OK ==

fastdds_python/test/api/test_qos.py

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

7878
# .user_data
79-
datareader_qos.user_data().push_back(0)
80-
datareader_qos.user_data().push_back(1)
81-
datareader_qos.user_data().push_back(2)
82-
datareader_qos.user_data().push_back(3)
79+
datareader_qos.user_data().append(0)
80+
datareader_qos.user_data().append(1)
81+
datareader_qos.user_data().append(2)
82+
datareader_qos.user_data().append(3)
8383
count = 1
8484
for user_value in datareader_qos.user_data():
8585
if 1 == count:
@@ -554,10 +554,10 @@ def test_datawriter_qos():
554554
assert(33 == datawriter_qos.lifespan().duration.nanosec)
555555

556556
# .user_data
557-
datawriter_qos.user_data().push_back(0)
558-
datawriter_qos.user_data().push_back(1)
559-
datawriter_qos.user_data().push_back(2)
560-
datawriter_qos.user_data().push_back(3)
557+
datawriter_qos.user_data().append(0)
558+
datawriter_qos.user_data().append(1)
559+
datawriter_qos.user_data().append(2)
560+
datawriter_qos.user_data().append(3)
561561
count = 1
562562
for user_value in datawriter_qos.user_data():
563563
if 1 == count:
@@ -867,10 +867,10 @@ def test_topic_qos():
867867
topic_qos = fastdds.TopicQos()
868868

869869
# .topic_data
870-
topic_qos.topic_data().push_back(0)
871-
topic_qos.topic_data().push_back(1)
872-
topic_qos.topic_data().push_back(2)
873-
topic_qos.topic_data().push_back(3)
870+
topic_qos.topic_data().append(0)
871+
topic_qos.topic_data().append(1)
872+
topic_qos.topic_data().append(2)
873+
topic_qos.topic_data().append(3)
874874
count = 1
875875
for topic_value in topic_qos.topic_data():
876876
if 1 == count:
@@ -1085,10 +1085,10 @@ def test_subscriber_qos():
10851085
assert('Partition2' == subscriber_qos.partition()[1])
10861086

10871087
# .group_data
1088-
subscriber_qos.group_data().push_back(0)
1089-
subscriber_qos.group_data().push_back(1)
1090-
subscriber_qos.group_data().push_back(2)
1091-
subscriber_qos.group_data().push_back(3)
1088+
subscriber_qos.group_data().append(0)
1089+
subscriber_qos.group_data().append(1)
1090+
subscriber_qos.group_data().append(2)
1091+
subscriber_qos.group_data().append(3)
10921092
count = 1
10931093
for group_value in subscriber_qos.group_data():
10941094
if 1 == count:
@@ -1169,10 +1169,10 @@ def test_publisher_qos():
11691169
assert('Partition2' == publisher_qos.partition()[1])
11701170

11711171
# .group_data
1172-
publisher_qos.group_data().push_back(0)
1173-
publisher_qos.group_data().push_back(1)
1174-
publisher_qos.group_data().push_back(2)
1175-
publisher_qos.group_data().push_back(3)
1172+
publisher_qos.group_data().append(0)
1173+
publisher_qos.group_data().append(1)
1174+
publisher_qos.group_data().append(2)
1175+
publisher_qos.group_data().append(3)
11761176
count = 1
11771177
for group_value in publisher_qos.group_data():
11781178
if 1 == count:
@@ -1347,10 +1347,10 @@ def test_domain_participant_qos():
13471347
assert(not participant_qos.transport().use_builtin_transports)
13481348

13491349
# .user_data
1350-
participant_qos.user_data().push_back(0)
1351-
participant_qos.user_data().push_back(1)
1352-
participant_qos.user_data().push_back(2)
1353-
participant_qos.user_data().push_back(3)
1350+
participant_qos.user_data().append(0)
1351+
participant_qos.user_data().append(1)
1352+
participant_qos.user_data().append(2)
1353+
participant_qos.user_data().append(3)
13541354
count = 1
13551355
for user_value in participant_qos.user_data():
13561356
if 1 == count:

0 commit comments

Comments
 (0)