1. Make CDRWriter remember its top level struct value type
2. Populate the trivially serializable cache when CDRWriter is created instead of waiting until the first time a message is sent.
3. Speed up arrays/sequences of trivially serializable structs
Signed-off-by: Dan Rose <dan@digilabs.io>
Introduce a new [[noreturn]] unreachable() function that marks code as unreachable and throws a logic error if it is executed.
Fix build error due to Windows min/max macros.
Fix linker errors from referring to a non-constexpr extern from a constexpr.
Fix warnings about narrowing conversions.
Signed-off-by: Dan Rose <dan@digilabs.io>
* Use rcutils_get_env() instead of getenv() (#71)
Signed-off-by: Erik Boasson <eb@ilities.com>
* Keep includes in alphabetical order
Signed-off-by: Erik Boasson <eb@ilities.com>
Cyclone's original code for dds_create_domain() appears to create a
domain entity that is automatically deleted when the last attached
participant disappears. In reality, it leaks a reference while
returning DDS_RETCODE_OK, making it appear as-if it is a regular entity
that remains into existence until explicitly deleted.
The RMW code assumed that it would be automatically deleted when the
last node was destroyed and that a subsequent call to rmw_create_node
could create the domain anew. This then fails with "precondition not
met".
In an upcoming fixed version of dds_create_domain() the domain entities
will behave normally (return a handle, require an explicit delete).
This commit provides a workaround for the bug in the original
implementation: by recovering the handle from the first participant the
preceding commits that were intended to future-proof the code will
ensure that the entity now gets deleted explicitly.
Signed-off-by: Erik Boasson <eb@ilities.com>
* Support localhost-only communications
Signed-off-by: Erik Boasson <eb@ilities.com>
* Future-proof localhost-only for upcoming Cyclone fix
Signed-off-by: Erik Boasson <eb@ilities.com>
The rmw_return_loaned_message and rmw_release_loaned_message functions
are still expected by rcl, even if they are scheduled to be replaced.
We need a working build, so add them for now.
Signed-off-by: Erik Boasson <eb@ilities.com>
* Add localhost boolean parameter to create node function
Signed-off-by: Brian Ezequiel Marchi <brian.marchi65@gmail.com>
* Cast to void to avoid compilation warning
Signed-off-by: Brian Ezequiel Marchi <brian.marchi65@gmail.com>
* Validation in Deserializer
Added validation in CDR deserialization: max buffer length is checked
when deserializing fields and strings are checked for null-terminator
(except for wstrings, which are serialized without null-terminator).
Signed-off-by: Dennis Potman <dennis.potman@adlinktech.com>
* Catch exceptions in serdata functions
In serdata functions rmw_print, rmw_to_sample and rmw_from_sample
catch exceptions so that correct return code is given when functions
are called from ddsi.
Signed-off-by: Dennis Potman <dennis.potman@adlinktech.com>
* Improve deserialisation validation
Refactored the deserialisation validation functions so that sequence
length is checked more properly and protection against overflows.
Renamed source files for exceptions so that it conforms to ros2 /
google c++ style guide.
Signed-off-by: Dennis Potman <dennis.potman@adlinktech.com>
Cyclone DDS always returns immediately from ``dds_waitset_wait`` when
there are no entities in the waitset, but the rcl timer test implies
that the expectation is that blocks. By adding a guard condition that
is never triggered this expectation is met.
Signed-off-by: Erik Boasson <eb@ilities.com>
* Return history depth even when KEEP_ALL is selected
* Return deadline, lifespan, liveliness
This doesn't fix it completely: the latter three are not actually
supported and are still ignored when creating an publisher or subscriber
node; and moreover it is not clear how to map infinity.
Signed-off-by: Erik Boasson <eb@ilities.com>
Otherwise each writer/reader gets its own, and at approximately 1kB
each, with hundreds of endpoints that starts adding up to a meaningful
amount of memory.
Signed-off-by: Erik Boasson <eb@ilities.com>
The built-in topics readers in the RMW node are currently not used for
anything other than triggering the guard condition. All the query
functions just get their own data set from Cyclone. Taking all samples
instead of just the not-alive ones reduces memory usage.
Signed-off-by: Erik Boasson <eb@ilities.com>
Misuse of std::vector resize as if it would leave any reserved entries
unchanged caused a misinterpretation of entries whenever the number of
triggering entities was larger than the number of triggering entities in
the preceding call to rmw_wait: these would all be mapped to the first
entity in the set.
If the waitset is reused from call to call and spurious events are
handled gracefully, this is recoverable; otherwise, no such luck.
Moreover, not accounting for a sentinel entry added to the list of
triggered entities means it would never return RMW_RET_TIMEOUT.
Signed-off-by: Erik Boasson <eb@ilities.com>