Skip to content

Commit

Permalink
Refs #18050. Fix segfault
Browse files Browse the repository at this point in the history
Signed-off-by: Ricardo González Moreno <ricardo@richiware.dev>
  • Loading branch information
richiware committed Apr 10, 2023
1 parent 5118b56 commit 4482d40
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 10 deletions.
11 changes: 10 additions & 1 deletion src/cpp/fastdds/domain/DomainParticipantImpl.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,10 @@ DomainParticipantImpl::DomainParticipantImpl(

// Pre calculate participant id and generated guid
participant_id_ = qos_.wire_protocol().participant_id;
eprosima::fastrtps::rtps::RTPSDomainImpl::create_participant_guid(participant_id_, guid_);
if (!eprosima::fastrtps::rtps::RTPSDomainImpl::create_participant_guid(participant_id_, guid_))
{
EPROSIMA_LOG_ERROR(DOMAIN_PARTICIPANT, "Error generating GUID for participant");
}

/* Fill physical data properties if they are found and empty */
std::string* property_value = fastrtps::rtps::PropertyPolicyHelper::find_property(
Expand Down Expand Up @@ -255,6 +258,12 @@ ReturnCode_t DomainParticipantImpl::enable()
// Should not have been previously enabled
assert(get_rtps_participant() == nullptr);

// Preconditions
if (guid_ == GUID_t::unknown())
{
return ReturnCode_t::RETCODE_PRECONDITION_NOT_MET;
}

fastrtps::rtps::RTPSParticipantAttributes rtps_attr;
utils::set_attributes_from_qos(rtps_attr, qos_);
rtps_attr.participantID = participant_id_;
Expand Down
35 changes: 28 additions & 7 deletions src/cpp/rtps/RTPSDomain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -636,19 +636,40 @@ uint32_t RTPSDomainImpl::get_id_for_prefix(
return ret;
}

void RTPSDomainImpl::create_participant_guid(
int32_t& participant_id,
GUID_t& guid)
bool RTPSDomainImpl::reserve_participant_id(
int32_t& participant_id)
{
auto instance = get_instance();
std::lock_guard<std::mutex> guard(instance->m_mutex);
if (participant_id < 0)
{
auto instance = get_instance();
std::lock_guard<std::mutex> guard(instance->m_mutex);
participant_id = instance->getNewId();
}
else
{
if (instance->m_RTPSParticipantIDs[participant_id].reserved == true)
{
return false;
}
instance->m_RTPSParticipantIDs[participant_id].reserved = true;
}

return true;
}

bool RTPSDomainImpl::create_participant_guid(
int32_t& participant_id,
GUID_t& guid)
{
bool ret_value = reserve_participant_id(participant_id);

if (ret_value)
{
guid_prefix_create(participant_id, guid.guidPrefix);
guid.entityId = c_EntityId_RTPSParticipant;
}

guid_prefix_create(participant_id, guid.guidPrefix);
guid.entityId = c_EntityId_RTPSParticipant;
return ret_value;
}

RTPSParticipantImpl* RTPSDomainImpl::find_local_participant(
Expand Down
14 changes: 13 additions & 1 deletion src/cpp/rtps/RTPSDomainImpl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,8 +149,10 @@ class RTPSDomainImpl
* @param [in, out] participant_id Participant identifier for which to generate the GUID.
* When negative, it will be modified to the first non-existent participant id.
* @param [out] guid GUID corresponding to participant_id
*
* @return True value if guid was created. False in other case.
*/
static void create_participant_guid(
static bool create_participant_guid(
int32_t& participant_id,
GUID_t& guid);

Expand Down Expand Up @@ -216,6 +218,16 @@ class RTPSDomainImpl
int32_t input_id,
uint32_t& participant_id);

/**
* Reserves a participant id.
* @param [in, out] participant_id Participant identifier for reservation.
* When negative, it will be modified to the first non-existent participant id.
*
* @return True value if reservation was possible. False in other case.
*/
static bool reserve_participant_id(
int32_t& participant_id);

uint32_t get_id_for_prefix(
uint32_t participant_id);

Expand Down
3 changes: 2 additions & 1 deletion test/mock/rtps/RTPSDomainImpl/rtps/RTPSDomainImpl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -61,10 +61,11 @@ class RTPSDomainImpl
return nullptr;
}

static void create_participant_guid(
static bool create_participant_guid(
int32_t& /*participant_id*/,
GUID_t& /*guid*/)
{
return true;
}

/**
Expand Down

0 comments on commit 4482d40

Please sign in to comment.