Skip to content

Commit d355648

Browse files
committed
Refs #21670: Avoid data race with listeners and dtors
Signed-off-by: cferreiragonz <carlosferreira@eprosima.com>
1 parent 40af43c commit d355648

6 files changed

Lines changed: 214 additions & 130 deletions

File tree

ddspipe_participants/include/ddspipe_participants/participant/dds/CommonParticipant.hpp

Lines changed: 44 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ namespace dds {
6060
* @warning This Participant class does not support RPC so far.
6161
* @todo TODO
6262
*/
63-
class CommonParticipant : public core::IParticipant, public fastdds::dds::DomainParticipantListener
63+
class CommonParticipant : public core::IParticipant
6464
{
6565
public:
6666

@@ -112,23 +112,42 @@ class CommonParticipant : public core::IParticipant, public fastdds::dds::Domain
112112
// LISTENER METHODS
113113
/////////////////////////
114114

115-
void on_participant_discovery(
116-
fastdds::dds::DomainParticipant* participant,
117-
fastdds::rtps::ParticipantDiscoveryStatus reason,
118-
const fastdds::rtps::ParticipantBuiltinTopicData& info,
119-
bool& /*should_be_ignored*/) override;
115+
class DDSListener : public fastdds::dds::DomainParticipantListener
116+
{
117+
public:
120118

121-
void on_data_reader_discovery(
122-
fastdds::dds::DomainParticipant* participant,
123-
fastdds::rtps::ReaderDiscoveryStatus reason,
124-
const fastdds::dds::SubscriptionBuiltinTopicData& info,
125-
bool& /*should_be_ignored*/) override;
119+
explicit DDSListener(
120+
CommonParticipant* owner)
121+
: participant_(owner)
122+
{
123+
}
126124

127-
void on_data_writer_discovery(
128-
fastdds::dds::DomainParticipant* participant,
129-
fastdds::rtps::WriterDiscoveryStatus reason,
130-
const fastdds::dds::PublicationBuiltinTopicData& info,
131-
bool& /*should_be_ignored*/) override;
125+
void on_participant_discovery(
126+
fastdds::dds::DomainParticipant* participant,
127+
fastdds::rtps::ParticipantDiscoveryStatus reason,
128+
const fastdds::rtps::ParticipantBuiltinTopicData& info,
129+
bool& /*should_be_ignored*/) override;
130+
131+
void on_data_reader_discovery(
132+
fastdds::dds::DomainParticipant* participant,
133+
fastdds::rtps::ReaderDiscoveryStatus reason,
134+
const fastdds::dds::SubscriptionBuiltinTopicData& info,
135+
bool& /*should_be_ignored*/) override;
136+
137+
void on_data_writer_discovery(
138+
fastdds::dds::DomainParticipant* participant,
139+
fastdds::rtps::WriterDiscoveryStatus reason,
140+
const fastdds::dds::PublicationBuiltinTopicData& info,
141+
bool& /*should_be_ignored*/) override;
142+
143+
private:
144+
145+
//! Participant that owns this listener
146+
const CommonParticipant* participant_;
147+
148+
};
149+
150+
std::unique_ptr<fastdds::dds::DomainParticipantListener> dds_participant_listener_;
132151

133152
protected:
134153

@@ -159,6 +178,15 @@ class CommonParticipant : public core::IParticipant, public fastdds::dds::Domain
159178
fastdds::dds::DomainParticipant*
160179
create_dds_participant_();
161180

181+
/**
182+
* @brief Virtual method that creates a listener for the internal DDS Participant.
183+
* It should be overridden if a different listener is needed.
184+
*/
185+
virtual std::unique_ptr<fastdds::dds::DomainParticipantListener> create_listener()
186+
{
187+
return std::make_unique<DDSListener>(this);
188+
}
189+
162190
/////////////////////////
163191
// INTERNAL METHODS
164192
/////////////////////////

ddspipe_participants/include/ddspipe_participants/participant/dynamic_types/DynTypesParticipant.hpp

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -74,22 +74,45 @@ class DynTypesParticipant : public rtps::SimpleParticipant
7474
std::shared_ptr<core::IReader> create_reader(
7575
const core::ITopic& topic) override;
7676

77-
DDSPIPE_PARTICIPANTS_DllAPI
78-
void on_reader_discovery(
79-
fastdds::rtps::RTPSParticipant* participant,
80-
fastdds::rtps::ReaderDiscoveryStatus reason,
81-
const fastdds::rtps::SubscriptionBuiltinTopicData& info,
82-
bool& should_be_ignored) override;
83-
84-
DDSPIPE_PARTICIPANTS_DllAPI
85-
void on_writer_discovery(
86-
fastdds::rtps::RTPSParticipant* participant,
87-
fastdds::rtps::WriterDiscoveryStatus reason,
88-
const fastdds::rtps::PublicationBuiltinTopicData& info,
89-
bool& should_be_ignored) override;
77+
class DynRTPSListener : public rtps::CommonParticipant::RTPSListener
78+
{
79+
public:
80+
81+
explicit DynRTPSListener(
82+
DynTypesParticipant* owner)
83+
: rtps::CommonParticipant::RTPSListener(owner)
84+
, dyn_participant_(owner)
85+
{
86+
}
87+
88+
DDSPIPE_PARTICIPANTS_DllAPI
89+
void on_reader_discovery(
90+
fastdds::rtps::RTPSParticipant* participant,
91+
fastdds::rtps::ReaderDiscoveryStatus reason,
92+
const fastdds::rtps::SubscriptionBuiltinTopicData& info,
93+
bool& should_be_ignored) override;
94+
95+
DDSPIPE_PARTICIPANTS_DllAPI
96+
void on_writer_discovery(
97+
fastdds::rtps::RTPSParticipant* participant,
98+
fastdds::rtps::WriterDiscoveryStatus reason,
99+
const fastdds::rtps::PublicationBuiltinTopicData& info,
100+
bool& should_be_ignored) override;
101+
102+
private:
103+
104+
//! Pointer to the DynTypesParticipant that owns this listener
105+
DynTypesParticipant* dyn_participant_;
106+
107+
};
90108

91109
protected:
92110

111+
std::unique_ptr<fastdds::rtps::RTPSParticipantListener> create_listener() override
112+
{
113+
return std::make_unique<DynRTPSListener>(this);
114+
}
115+
93116
void notify_type_discovered_(
94117
const fastdds::dds::xtypes::TypeInformation& type_info,
95118
const std::string& type_name);

ddspipe_participants/include/ddspipe_participants/participant/rtps/CommonParticipant.hpp

Lines changed: 63 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ namespace rtps {
5252
*/
5353
class CommonParticipant
5454
: public core::IParticipant
55-
, public fastdds::rtps::RTPSParticipantListener
5655
{
5756
public:
5857

@@ -123,41 +122,60 @@ class CommonParticipant
123122
// RTPS LISTENER METHODS
124123
/////////////////////////
125124

126-
/**
127-
* @brief Override method from \c RTPSParticipantListener .
128-
*
129-
* This method only is for debugging purposes.
130-
*/
131-
DDSPIPE_PARTICIPANTS_DllAPI
132-
virtual void on_participant_discovery(
133-
fastdds::rtps::RTPSParticipant* participant,
134-
fastdds::rtps::ParticipantDiscoveryStatus reason,
135-
const fastdds::rtps::ParticipantBuiltinTopicData& info,
136-
bool& /*should_be_ignored*/) override;
137-
138-
/**
139-
* @brief Override method from \c RTPSParticipantListener .
140-
*
141-
* This method adds to database the endpoint discovered or modified.
142-
*/
143-
DDSPIPE_PARTICIPANTS_DllAPI
144-
virtual void on_reader_discovery(
145-
fastdds::rtps::RTPSParticipant* participant,
146-
fastdds::rtps::ReaderDiscoveryStatus reason,
147-
const fastdds::rtps::SubscriptionBuiltinTopicData& info,
148-
bool& /*should_be_ignored*/) override;
149-
150-
/**
151-
* @brief Override method from \c RTPSParticipantListener .
152-
*
153-
* This method adds to database the endpoint discovered or modified.
154-
*/
155-
DDSPIPE_PARTICIPANTS_DllAPI
156-
virtual void on_writer_discovery(
157-
fastdds::rtps::RTPSParticipant* participant,
158-
fastdds::rtps::WriterDiscoveryStatus reason,
159-
const fastdds::rtps::PublicationBuiltinTopicData& info,
160-
bool& /*should_be_ignored*/) override;
125+
class RTPSListener : public fastdds::rtps::RTPSParticipantListener
126+
{
127+
public:
128+
129+
explicit RTPSListener(
130+
CommonParticipant* owner)
131+
: participant_(owner)
132+
{
133+
}
134+
135+
/**
136+
* @brief Override method from \c RTPSParticipantListener .
137+
*
138+
* This method is only used for debugging purposes.
139+
*/
140+
DDSPIPE_PARTICIPANTS_DllAPI
141+
virtual void on_participant_discovery(
142+
fastdds::rtps::RTPSParticipant* participant,
143+
fastdds::rtps::ParticipantDiscoveryStatus reason,
144+
const fastdds::rtps::ParticipantBuiltinTopicData& info,
145+
bool& /*should_be_ignored*/) override;
146+
147+
/**
148+
* @brief Override method from \c RTPSParticipantListener .
149+
*
150+
* This method adds to database the endpoint discovered or modified.
151+
*/
152+
DDSPIPE_PARTICIPANTS_DllAPI
153+
virtual void on_reader_discovery(
154+
fastdds::rtps::RTPSParticipant* participant,
155+
fastdds::rtps::ReaderDiscoveryStatus reason,
156+
const fastdds::rtps::SubscriptionBuiltinTopicData& info,
157+
bool& /*should_be_ignored*/) override;
158+
159+
/**
160+
* @brief Override method from \c RTPSParticipantListener .
161+
*
162+
* This method adds to database the endpoint discovered or modified.
163+
*/
164+
DDSPIPE_PARTICIPANTS_DllAPI
165+
virtual void on_writer_discovery(
166+
fastdds::rtps::RTPSParticipant* participant,
167+
fastdds::rtps::WriterDiscoveryStatus reason,
168+
const fastdds::rtps::PublicationBuiltinTopicData& info,
169+
bool& /*should_be_ignored*/) override;
170+
171+
protected:
172+
173+
//! Participant that owns this listener
174+
const CommonParticipant* participant_;
175+
176+
};
177+
178+
std::unique_ptr<fastdds::rtps::RTPSParticipantListener> rtps_participant_listener_;
161179

162180
//////////////////
163181
// STATIC METHODS
@@ -221,6 +239,15 @@ class CommonParticipant
221239
DDSPIPE_PARTICIPANTS_DllAPI
222240
virtual fastdds::rtps::RTPSParticipantAttributes reckon_participant_attributes_() const;
223241

242+
/**
243+
* @brief Virtual method that creates a listener for the internal RTPS Participant.
244+
* It should be overridden if a different listener is needed.
245+
*/
246+
virtual std::unique_ptr<fastdds::rtps::RTPSParticipantListener> create_listener()
247+
{
248+
return std::make_unique<RTPSListener>(this);
249+
}
250+
224251
/////
225252
// VARIABLES
226253

0 commit comments

Comments
 (0)