let dds_get_qos reset the input qos first
Getting a QoS from an entity is akin to reading, and all read/take operations reuse or free/reallocate memory to avoid memory leaks, and so it is a reasonable assumption that calling dds_get_qos repeatedly without intervening calls to dds_reset_qos would not leak any memory either. (This was actually an assumption in the builtin topics test.) Therefore, it is reasonable to first call dds_reset_qos in dds_get_qos. All operations in the API that yield or modify a QoS object result in a properly initialised one, therefore the input to dds_get_qos is necessarily initialised, and so this is safe. Signed-off-by: Erik Boasson <eb@ilities.com>
This commit is contained in:
parent
102e657d45
commit
98f757a5ab
1 changed files with 6 additions and 3 deletions
|
@ -363,10 +363,13 @@ dds_return_t dds_get_qos (dds_entity_t entity, dds_qos_t *qos)
|
||||||
if ((rc = dds_entity_lock (entity, DDS_KIND_DONTCARE, &e)) != DDS_RETCODE_OK)
|
if ((rc = dds_entity_lock (entity, DDS_KIND_DONTCARE, &e)) != DDS_RETCODE_OK)
|
||||||
return DDS_ERRNO (rc);
|
return DDS_ERRNO (rc);
|
||||||
|
|
||||||
if (e->m_deriver.set_qos)
|
if (e->m_deriver.set_qos == 0)
|
||||||
ret = dds_copy_qos (qos, e->m_qos);
|
|
||||||
else
|
|
||||||
ret = DDS_ERRNO(DDS_RETCODE_ILLEGAL_OPERATION);
|
ret = DDS_ERRNO(DDS_RETCODE_ILLEGAL_OPERATION);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dds_reset_qos (qos);
|
||||||
|
ret = dds_copy_qos (qos, e->m_qos);
|
||||||
|
}
|
||||||
dds_entity_unlock(e);
|
dds_entity_unlock(e);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue