Skip to content

Commit

Permalink
Refs #21044. Fix
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 May 30, 2024
1 parent adffc26 commit 8c96c69
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 31 deletions.
77 changes: 48 additions & 29 deletions src/cpp/fastdds/xtypes/type_representation/TypeObjectRegistry.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -316,29 +316,28 @@ ReturnCode_t TypeObjectRegistry::get_type_information(
TypeInformation& type_information,
bool with_dependencies)
{
if (TK_NONE == type_ids.type_identifier1()._d() ||
TK_NONE == type_ids.type_identifier2()._d())
if (TK_NONE == type_ids.type_identifier1()._d())
{
return RETCODE_PRECONDITION_NOT_MET;
}

if (!TypeObjectUtils::is_direct_hash_type_identifier(type_ids.type_identifier1()) ||
!TypeObjectUtils::is_direct_hash_type_identifier(type_ids.type_identifier2()))
(TK_NONE != type_ids.type_identifier2()._d() &&
!TypeObjectUtils::is_direct_hash_type_identifier(type_ids.type_identifier2())))
{
return eprosima::fastdds::dds::RETCODE_BAD_PARAMETER;
}

if (type_registry_entries_.end() == type_registry_entries_.find(type_ids.type_identifier1()) ||
type_registry_entries_.end() == type_registry_entries_.find(type_ids.type_identifier2()))
{
return RETCODE_NO_DATA;
std::lock_guard<std::mutex> data_guard(type_object_registry_mutex_);
if (type_registry_entries_.end() == type_registry_entries_.find(type_ids.type_identifier1()) ||
(TK_NONE != type_ids.type_identifier2()._d() &&
type_registry_entries_.end() == type_registry_entries_.find(type_ids.type_identifier2())))
{
return RETCODE_NO_DATA;
}
}

if (!TypeObjectUtils::is_direct_hash_type_identifier(type_ids.type_identifier1()) ||
!TypeObjectUtils::is_direct_hash_type_identifier(type_ids.type_identifier2()))
{
return eprosima::fastdds::dds::RETCODE_BAD_PARAMETER;
}
if (EK_COMPLETE == type_ids.type_identifier1()._d())
{
type_information.complete().typeid_with_size().type_id(type_ids.type_identifier1());
Expand All @@ -362,19 +361,26 @@ ReturnCode_t TypeObjectRegistry::get_type_information(
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION, "Error retrieving complete type dependenciest.");
}

if (RETCODE_OK == get_type_dependencies_impl({type_ids.type_identifier2()},
type_dependencies))
if (TK_NONE != type_ids.type_identifier2()._d())
{
type_information.minimal().dependent_typeid_count(static_cast<int32_t>(type_dependencies.size()));
for (auto& dependency : type_dependencies)
if (RETCODE_OK == get_type_dependencies_impl({type_ids.type_identifier2()},
type_dependencies))
{
type_information.minimal().dependent_typeids().emplace_back(std::move(dependency));
type_information.minimal().dependent_typeid_count(static_cast<int32_t>(type_dependencies.size()));
for (auto& dependency : type_dependencies)
{
type_information.minimal().dependent_typeids().emplace_back(std::move(dependency));
}
type_dependencies.clear();
}
else
{
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION, "Error retrieving minimal type dependenciest.");
}
type_dependencies.clear();
}
else
{
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION, "Error retrieving minimal type dependenciest.");
type_information.minimal().dependent_typeid_count(NO_DEPENDENCIES);
}
}
else
Expand All @@ -386,8 +392,11 @@ ReturnCode_t TypeObjectRegistry::get_type_information(
std::lock_guard<std::mutex> data_guard(type_object_registry_mutex_);
type_information.complete().typeid_with_size().typeobject_serialized_size(type_registry_entries_.at(
type_ids.type_identifier1()).type_object_serialized_size_);
type_information.minimal().typeid_with_size().typeobject_serialized_size(type_registry_entries_.at(
type_ids.type_identifier2()).type_object_serialized_size_);
if (TK_NONE != type_ids.type_identifier2()._d())
{
type_information.minimal().typeid_with_size().typeobject_serialized_size(type_registry_entries_.at(
type_ids.type_identifier2()).type_object_serialized_size_);
}
}
else
{
Expand All @@ -412,19 +421,26 @@ ReturnCode_t TypeObjectRegistry::get_type_information(
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION, "Error retrieving minimal type dependenciest.");
}

if (RETCODE_OK == get_type_dependencies_impl({type_ids.type_identifier2()},
type_dependencies))
if (TK_NONE != type_ids.type_identifier2()._d())
{
type_information.complete().dependent_typeid_count(static_cast<int32_t>(type_dependencies.size()));
for (auto& dependency : type_dependencies)
if (RETCODE_OK == get_type_dependencies_impl({type_ids.type_identifier2()},
type_dependencies))
{
type_information.complete().dependent_typeids().emplace_back(std::move(dependency));
type_information.complete().dependent_typeid_count(static_cast<int32_t>(type_dependencies.size()));
for (auto& dependency : type_dependencies)
{
type_information.complete().dependent_typeids().emplace_back(std::move(dependency));
}
type_dependencies.clear();
}
else
{
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION, "Error retrieving complete type dependenciest.");
}
type_dependencies.clear();
}
else
{
EPROSIMA_LOG_ERROR(XTYPES_TYPE_REPRESENTATION, "Error retrieving complete type dependenciest.");
type_information.minimal().dependent_typeid_count(NO_DEPENDENCIES);
}
}
else
Expand All @@ -436,8 +452,11 @@ ReturnCode_t TypeObjectRegistry::get_type_information(
std::lock_guard<std::mutex> data_guard(type_object_registry_mutex_);
type_information.minimal().typeid_with_size().typeobject_serialized_size(type_registry_entries_.at(
type_ids.type_identifier1()).type_object_serialized_size_);
type_information.complete().typeid_with_size().typeobject_serialized_size(type_registry_entries_.at(
type_ids.type_identifier2()).type_object_serialized_size_);
if (TK_NONE != type_ids.type_identifier2()._d())
{
type_information.complete().typeid_with_size().typeobject_serialized_size(type_registry_entries_.at(
type_ids.type_identifier2()).type_object_serialized_size_);
}
}
return RETCODE_OK;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,9 +200,9 @@ class TypeObjectRegistry : public ITypeObjectRegistry
TypeObject& type_object) override;

/**
* @brief Get the TypeInformation related to a specific type_name.
* @brief Build the TypeInformation related to the provided @ref TypeIdentifierPair.
*
* @pre type_ids must not be empty.
* @pre type_ids must not be empty. At least @ref TypeIdentifierPair::type_identifier1 must be filled.
*
* @param[in] type_ids @ref TypeIdentifier which type information is queried.
* @param[out] type_information Related TypeInformation for the given @ref TypeIdentifier.
Expand Down

0 comments on commit 8c96c69

Please sign in to comment.